├── .nojekyll ├── .gitignore ├── javascripts └── main.js ├── images ├── bash.gif ├── conda.gif ├── body-bg.jpg ├── jupyter.gif ├── header-bg.jpg ├── sidebar-bg.jpg ├── terminal.gif ├── highlight-bg.jpg ├── download-button.png ├── github-button.png └── header-bg-unidata.jpg ├── _config.yml ├── README.md ├── index.html ├── support.md ├── .travis.yml ├── params.json ├── controlflowintro.md ├── _layouts └── default.html ├── what.md ├── choosing.md ├── stylesheets ├── github-light.css ├── print.css └── stylesheet.css ├── git.md ├── index.md ├── notebook.md ├── conda-windows.md ├── conda-osx.md └── introduction.md /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site/ 2 | -------------------------------------------------------------------------------- /javascripts/main.js: -------------------------------------------------------------------------------- 1 | console.log('This would be the main JS file.'); 2 | -------------------------------------------------------------------------------- /images/bash.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/bash.gif -------------------------------------------------------------------------------- /images/conda.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/conda.gif -------------------------------------------------------------------------------- /images/body-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/body-bg.jpg -------------------------------------------------------------------------------- /images/jupyter.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/jupyter.gif -------------------------------------------------------------------------------- /images/header-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/header-bg.jpg -------------------------------------------------------------------------------- /images/sidebar-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/sidebar-bg.jpg -------------------------------------------------------------------------------- /images/terminal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/terminal.gif -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | defaults: 2 | - 3 | scope: 4 | path: "" 5 | values: 6 | layout: "default" 7 | -------------------------------------------------------------------------------- /images/highlight-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/highlight-bg.jpg -------------------------------------------------------------------------------- /images/download-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/download-button.png -------------------------------------------------------------------------------- /images/github-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/github-button.png -------------------------------------------------------------------------------- /images/header-bg-unidata.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unidata/online-python-training/HEAD/images/header-bg-unidata.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # online-python-training 2 | Archived Repo for materials associated with the Online Python Training (OPT). This material can now be found 3 | in [Unidata's Python Training](https://github.com/Unidata/python-training) repository. 4 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Redirecting to Unidata Python Training 4 | 5 | 6 | -------------------------------------------------------------------------------- /support.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Unidata Python Support 3 | --- 4 | 5 | # Unidata Python Support 6 | 7 | ## Unidata Python Mailing List 8 | 9 | For additional questions or comments regarding Unidata's Online Python Training please send a message to the Unidata Python email list: . 10 | 11 | ## Github Issues 12 | 13 | If you have specific problems you would like to see addressed concerning the Unidata Online Python Training, consider [submitting a github issue](https://github.com/Unidata/online-python-training/issues). 14 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | # For running jekyll 4 | language: ruby 5 | 6 | # Needed for some github-pages dependencies 7 | rvm: 2.4 8 | 9 | branches: 10 | only: 11 | - master 12 | - gh-pages 13 | 14 | before_install: 15 | - gem install github-pages 16 | - pip install --user --upgrade pyopenssl 17 | - pip install --user ndg-httpsclient pyasn1 "requests[security]>=2.22.0" "urllib3[secure]>=1.22" 18 | - pip install --user git+https://github.com/linkcheck/linkchecker 19 | 20 | script: 21 | - jekyll build 2>build.log 22 | - if [ -s build.log ]; then 23 | echo Build produced errors:; 24 | cat build.log; 25 | false; 26 | else 27 | echo Checking links; 28 | linkchecker --anchors --check-extern _site; 29 | fi 30 | -------------------------------------------------------------------------------- /params.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Online-python-training", 3 | "tagline": "Repo for materials associated with the Online Training Project (OTP)", 4 | "body": "### Welcome to GitHub Pages.\r\nThis automatic page generator is the easiest way to create beautiful pages for all of your projects. Author your page content here [using GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/), select a template crafted by a designer, and publish. After your page is generated, you can check out the new `gh-pages` branch locally. If you’re using GitHub Desktop, simply sync your repository and you’ll see the new branch.\r\n\r\n### Designer Templates\r\nWe’ve crafted some handsome templates for you to use. Go ahead and click 'Continue to layouts' to browse through them. You can easily go back to edit your page before publishing. After publishing your page, you can revisit the page generator and switch to another theme. Your Page content will be preserved.\r\n\r\n### Creating pages manually\r\nIf you prefer to not use the automatic generator, push a branch named `gh-pages` to your repository to create a page manually. In addition to supporting regular HTML content, GitHub Pages support Jekyll, a simple, blog aware static site generator. Jekyll makes it easy to create site-wide headers and footers without having to copy them across every page. It also offers intelligent blog support and other advanced templating features.\r\n\r\n### Authors and Contributors\r\nYou can @mention a GitHub username to generate a link to their profile. The resulting `` element will link to the contributor’s GitHub Profile. For example: In 2007, Chris Wanstrath (@defunkt), PJ Hyett (@pjhyett), and Tom Preston-Werner (@mojombo) founded GitHub.\r\n\r\n### Support or Contact\r\nHaving trouble with Pages? Check out our [documentation](https://help.github.com/pages) or [contact support](https://github.com/contact) and we’ll help you sort it out.\r\n", 5 | "note": "Don't delete this file! It's used internally to help with page regeneration." 6 | } -------------------------------------------------------------------------------- /controlflowintro.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Control Flow 3 | --- 4 | 5 | # Control Flow 6 | 7 | Control flow concerns how programs proceed in their execution to arrive a desired outcome. Often times, we write programs to make decisions based on certain **conditions** such as input from the user or values in the data. Different conditions lead to a variety scenarios. Programs can make choices concerning meteorological conditions such as wind velocity. Consider a Python program that draws wind barbs on a map. It will have to take actions depending on the velocity of the wind data. The program will have to draw a flag for winds of greater than 47 knots but only one barb for 10 knot winds. 8 | 9 | In addition, control flow can also concern a program repeatedly executing a set of statements while proceeding through a list of values or while some condition has not yet been met. A rawinsonde may send data until a certain pressure level has been attained, for example. 10 | 11 | Control flow can be complex and programmers must learn to manage that complexity and keep it in check in order to write programs that can be understood by others and maintained in the long term. One way of managing that complexity is by delegating the control flow to **functions** to get a specific task done (e.g., unit conversion). Functions make code more readable, and easier to maintain as well as create units of reusable code that can be used in other parts of your program or in different programs. 12 | 13 | In this section, we will examine three Jupyter notebooks on control flow: one that examines [conditional statements](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Conditionals.ipynb), one that makes use of [loops](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Loops.ipynb), and finally a notebook that employs [functions](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Functions.ipynb) to improve the readability and reuse of code. 14 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 21 | 22 | 25 | 26 | {{ page.title }} 27 | 28 | 29 | 30 |
31 | 36 |
37 |
38 |
39 |
40 | {{ content }} 41 |
42 |
43 |
44 | 45 | 46 | -------------------------------------------------------------------------------- /what.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: What Is This? 3 | --- 4 | # What Is This? 5 | 6 | "If you want to build a ship, don't drum up people to collect wood and don't assign them tasks and work, but rather teach them to long for the endless immensity of the sea." -Antoine de Saint-Exupéry 7 | 8 | The Unidata Online Python Training is an interactive, geoscience focused approach to learning Python. There are many excellent books and web sites to learn Python, and this effort does not aim to duplicate those resources. Rather, we take the approach that geoscience students will be engaged to learn Python if they are presented with material that is relevant to the fields of atmospheric and oceanic science. The interactive Jupyter notebooks attempt to cast programming concepts with geoscience objectives. 9 | 10 | As much as we can, we try not to assume a programming or computer science background, but we will expect some exposure to geoscience. Programming concepts may be introduced as needed when we make a brief foray into object-oriented programming in the [Times and Dates](https://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Times%20and%20Dates.ipynb) Jupyter notebook, for example. 11 | 12 | The [Introduction](http://unidata.github.io/online-python-training/index.html#introduction) section and [Whetting Your Appetite for Python](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Whetting%2520Your%2520Appetite%2520for%2520Python.ipynb) Jupyter notebook explain the motivation for why Python is an excellent programming language and environment for geoscience analysis and visualization. The [Getting Started](http://unidata.github.io/online-python-training/index.html#getting-started) section will help students get going with the collaborative programming website [GitHub](https://github.com/Unidata). We will then guide students on how to [download and install Python](http://unidata.github.io/online-python-training/index.html#getting-started). Next, we will explain how to run [interactive Jupyter notebooks](http://unidata.github.io/online-python-training/index.html#getting-started) for geoscience exploration with Python. 13 | 14 | The remaining sections, [Beginning Python Concepts](http://unidata.github.io/online-python-training/index.html#beginning-python-concepts), [Scientific Python Packages](http://unidata.github.io/online-python-training/index.html#scientific-python-packages), [Python for Meteorology](http://unidata.github.io/online-python-training/index.html#python-for-meteorology), will consist of interactive Jupyter notebooks focused on teaching Python and scientific Python libraries by addressing geoscientific objectives. 15 | -------------------------------------------------------------------------------- /choosing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Which Python 3 | --- 4 | # Where to Get Python 5 | While it's possible to install Python directly from [python.org](https://wiki.python.org/moin/BeginnersGuide/Download), 6 | we recommend using [Conda](http://conda.pydata.org/docs/index.html) instead. 7 | Conda is a package management system, from ContinuumIO, created specifically to 8 | assist working with Python packages in a cross-platform fashion. Its real 9 | strength comes in handling Python packages which require compiled code--such 10 | packages are especially prevalent in the scientific Python ecosystem. 11 | 12 | Conda also has the concept of an environment, which is an independent, 13 | self-contained install of Python and packages. These environments make it easy 14 | to install different versions of Python side-by-side; this is especially useful 15 | when trying to test libraries on a variety of different Python versions. Other 16 | applications of environments: 17 | * Keeping a static install of Python with a known working set of packages for a 18 | particular project (e.g. journal article or thesis) 19 | * A disposable environment for testing a new library without polluting the rest 20 | of the Python install; this environment can easily be discarded when no 21 | longer needed 22 | * Quick set up of a known set of libraries and programs for workshops and tutorials 23 | 24 | ## Anaconda vs. Miniconda 25 | There are two options for getting Conda: 26 | [Anaconda](https://www.anaconda.com/distribution/) and 27 | [miniconda](https://conda.io/en/latest/miniconda.html). Anaconda is a full 28 | distribution of Python, and comes with over 150 packages in the download; 29 | consequently, this download is over 3GB. Anaconda is good if you want to have 30 | many packages downloaded and available in one shot; this is especially useful 31 | if you know you'll be working offline for awhile. Miniconda contains only 32 | Python and other libraries needed to run Conda itself; other packages will be 33 | downloaded and installed as requested. For more information, see 34 | [here](https://conda.io/en/latest/miniconda.html). 35 | 36 | ## Python 2 vs. 3 37 | In 2008, the core Python development team released Python 3.0; the goal of that 38 | release was to clean up a variety of issues with Python 2.x without worrying 39 | about complete backwards compatibility. At this point in time, Python 3.x 40 | represents the actively developed version of Python, with the 2.x series now 41 | "legacy", only seeing bug fixes. For scientific use, all major packages support 42 | Python 3. For information about what's new in Python 3, there are a variety of 43 | resources: 44 | 45 | - [Official Python Docs](https://docs.python.org/3/whatsnew/) 46 | - Lexy Munroe's Detailed [Why should I use Python 3?](https://eev.ee/blog/2016/07/31/python-faq-why-should-i-use-python-3/) 47 | - [Nick Coghlan's (core Python developer) Python Notes](http://python-notes.curiousefficiency.org/en/latest/python3/index.html) 48 | - [Brett Cannon's (another core developer) Blog](http://www.snarky.ca/why-python-3-exists) 49 | 50 | Our recommendation is to use Python 3 installed through Miniconda. All of the 51 | subsequent materials here will assume the use of Python 3; however, the use 52 | of features available **only** in Python 3 will be minimal (*if any*). 53 | -------------------------------------------------------------------------------- /stylesheets/github-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2014 GitHub Inc. 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | 16 | */ 17 | 18 | .pl-c /* comment */ { 19 | color: #969896; 20 | } 21 | 22 | .pl-c1 /* constant, markup.raw, meta.diff.header, meta.module-reference, meta.property-name, support, support.constant, support.variable, variable.other.constant */, 23 | .pl-s .pl-v /* string variable */ { 24 | color: #0086b3; 25 | } 26 | 27 | .pl-e /* entity */, 28 | .pl-en /* entity.name */ { 29 | color: #795da3; 30 | } 31 | 32 | .pl-s .pl-s1 /* string source */, 33 | .pl-smi /* storage.modifier.import, storage.modifier.package, storage.type.java, variable.other, variable.parameter.function */ { 34 | color: #333; 35 | } 36 | 37 | .pl-ent /* entity.name.tag */ { 38 | color: #63a35c; 39 | } 40 | 41 | .pl-k /* keyword, storage, storage.type */ { 42 | color: #a71d5d; 43 | } 44 | 45 | .pl-pds /* punctuation.definition.string, string.regexp.character-class */, 46 | .pl-s /* string */, 47 | .pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */, 48 | .pl-sr /* string.regexp */, 49 | .pl-sr .pl-cce /* string.regexp constant.character.escape */, 50 | .pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */, 51 | .pl-sr .pl-sre /* string.regexp source.ruby.embedded */ { 52 | color: #183691; 53 | } 54 | 55 | .pl-v /* variable */ { 56 | color: #ed6a43; 57 | } 58 | 59 | .pl-id /* invalid.deprecated */ { 60 | color: #b52a1d; 61 | } 62 | 63 | .pl-ii /* invalid.illegal */ { 64 | background-color: #b52a1d; 65 | color: #f8f8f8; 66 | } 67 | 68 | .pl-sr .pl-cce /* string.regexp constant.character.escape */ { 69 | color: #63a35c; 70 | font-weight: bold; 71 | } 72 | 73 | .pl-ml /* markup.list */ { 74 | color: #693a17; 75 | } 76 | 77 | .pl-mh /* markup.heading */, 78 | .pl-mh .pl-en /* markup.heading entity.name */, 79 | .pl-ms /* meta.separator */ { 80 | color: #1d3e81; 81 | font-weight: bold; 82 | } 83 | 84 | .pl-mq /* markup.quote */ { 85 | color: #008080; 86 | } 87 | 88 | .pl-mi /* markup.italic */ { 89 | color: #333; 90 | font-style: italic; 91 | } 92 | 93 | .pl-mb /* markup.bold */ { 94 | color: #333; 95 | font-weight: bold; 96 | } 97 | 98 | .pl-md /* markup.deleted, meta.diff.header.from-file */ { 99 | background-color: #ffecec; 100 | color: #bd2c00; 101 | } 102 | 103 | .pl-mi1 /* markup.inserted, meta.diff.header.to-file */ { 104 | background-color: #eaffea; 105 | color: #55a532; 106 | } 107 | 108 | .pl-mdr /* meta.diff.range */ { 109 | color: #795da3; 110 | font-weight: bold; 111 | } 112 | 113 | .pl-mo /* meta.output */ { 114 | color: #1d3e81; 115 | } 116 | 117 | -------------------------------------------------------------------------------- /git.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: What Is Git, Github and Why Do You Care 3 | --- 4 | 5 | # What Is Git, Github and Why Do You Care? 6 | 7 | ## Motivation 8 | 9 | When you start writing computer programs and Jupyter notebooks, you will need to save and keep track of your work as your code gains complexity. Moreover, you may want to share and collaborate on projects with other developers in your office or around the world. Or perhaps you aim to contribute and improve someone else's program. Version control software and distributed version control software satisfies these objectives and are now an essential tool for any software developer beginner or expert alike. It will be to your advantage to learn about version control early on. 10 | 11 | ## git 12 | 13 | Version control has existed for decades and has gone through many incarnations. git is an implementation of distributed version control technology that is currently popular and powerful. Git stands in contrast to centralized version control systems like SVN which you may have heard of. Git was originally developed by legendary programmer Linus Torvalds, creator the Linux operating system. Unhappy with the available choices, Linus wrote his own version control software to collaborate on the Linux operating system. Git gained popularity with developers enabling a huge number of contributions to Linux making it the most successful open source project today. The benefits of git were not isolated to the Linux operating system. Many projects such as the scientific plotting library [matplotlib](http://matplotlib.org/) have adopted git and in doing so have seen a [marked increased in collaboration and contributions](https://jakevdp.github.io/blog/2012/09/20/why-python-is-the-last/). When you leverage the power of the community, an enormous amount of work can get done. 14 | 15 | ## github 16 | 17 | [github](https://github.com/) is a website that hosts git projects for free. There is a good chance your favorite open source software project is on github. It comes with value added tools to help you keep track of issues and collaborate with colleagues. [Unidata has numerous projects on github](https://github.com/Unidata/netcdf-c), including this website, and other Python related projects such as [netcdf4-python](https://github.com/Unidata/netcdf4-python), the [Unidata Python Workshop](https://github.com/Unidata/unidata-python-workshop), [Metpy](https://github.com/metpy/MetPy), [Siphon](https://github.com/Unidata/siphon). Incidentally, when using git, you are not forced to use github for your project hosting. It is one of many options for git hosting including [BitBucket](https://bitbucket.org/), [GitLab](https://gitlab.com), or simply self-hosting. 18 | 19 | ## git in the Geosciences 20 | 21 | Several projects in the geoscience community have adopted git for their software projects: 22 | 23 | - [Community Earth System Model (CESM)](https://github.com/CESM-Development) 24 | - [Model for Prediction Across Scales (MPAS)](https://github.com/MPAS-Dev) 25 | - [netcdf](https://github.com/Unidata/netcdf-c) 26 | - [cartopy](https://github.com/SciTools/cartopy) 27 | 28 | ## Learning git 29 | 30 | Now that you know all about the benefits of git, we must tell you that git does come with a downside of being complex and not always user friendly, especially for beginners. Therefore, the remainder of this section concerns curated resources to learn git. We also suggest you take some time in advance to learn git, rather than immediately start experimenting with git from the command line or a user interface. Having some understanding of how git works ahead of time will save you much frustration. 31 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Welcome to Unidata's Online Python Training 3 | --- 4 | 5 | # Unidata's Online Python Training 6 | With support from the National Science Foundation, Unidata is working to create 7 | a collection of online training materials focused on the use of Python in the 8 | atmospheric sciences. While our examples and scenarios may feature Unidata tools 9 | and data technologies, our aim is to present a generic set of freely available 10 | tools that are generally useful to scientists, educators, and students in the 11 | geosciences, broadly defined. 12 | 13 | Unidata staff are actively developing and curating the material here, but what 14 | you see today is an early version of what we envision for this resource. Please 15 | forgive the unfinished nature of the materials here, and feel free to give us 16 | your suggestions for additions or improvements by contacting 17 | [Unidata Python Support](support.html). 18 | 19 | ## Introduction 20 | 21 | - [What Is This?](what.html) 22 | - [Why Python and Jupyter Notebooks?](introduction.html) 23 | 24 | ## Getting Started 25 | 26 | ### Git and Github 27 | 28 | GitHub is a online platform for hosting code that promotes collaboration. 29 | 30 | - [What Is Git, Github and Why Do You Care?](git.html) 31 | - [Introduction to GitHub](https://guides.github.com/activities/hello-world/) 32 | - [Creating a GitHub Account](https://egghead.io/lessons/javascript-introduction-to-github?series=how-to-contribute-to-an-open-source-project-on-github) (*Free* video from egghead.io) 33 | - [GitHub's Guides](https://guides.github.com/) 34 | - [How to Contribute on Github](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github) (*Free* video series from egghead.io) 35 | - [Online Interactive Git Tutorial (from GitHub)](https://try.github.io/) 36 | - [Mac OS X and Windows Desktop Applications for Using Git and Github](https://git-scm.com/download/gui/windows) 37 | 38 | ### Installing Python 39 | 40 | - [Which Python?](choosing.html) 41 | - [Installing Python on Mac OS X](conda-osx.html) 42 | - [Installing Python on Microsoft Windows](conda-windows.html) 43 | 44 | ### Jupyter Notebooks 45 | 46 | - [How to Start and Run a Jupyter Notebook](notebook.html) 47 | - [Unidata's Jupyter Notebook Gallery](http://unidata.github.io/notebook-gallery) 48 | - [Whetting Your Appetite for Python](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Whetting%20Your%20Appetite%20for%20Python.ipynb) 49 | 50 | ## Basic Python Syntax 51 | Here are some good sources for learning the basics of Python's Syntax: 52 | 53 | - [Codecademy](https://www.codecademy.com/learn/python) has some free lessons on learning Python 54 | - [learnpython.org](http://www.learnpython.org/) also has some free, interactive materials 55 | - The [official](https://docs.python.org/3.5/tutorial/index.html) Python tutorial is pretty good as well 56 | 57 | ## Beginning Python Concepts 58 | What follows is a series of Jupyter notebooks on learning Python with geoscience objectives. You can either peruse this material with the nbviewer links below or [run the Jupyter notebooks interactively](notebook.html#how-to-run-opt-notebooks). 59 | 60 | - [Control Flow](controlflowintro.html) 61 | - [Conditional Statements](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Conditionals.ipynb) 62 | - [Loops](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Loops.ipynb) 63 | - [Functions](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Functions.ipynb) 64 | - [Basic Data Structures](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Basic%20Data%20Structures.ipynb) 65 | - [Basic Input and Output](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Basic%20Input%20and%20Output.ipynb) 66 | - [Times and Dates](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Times%20and%20Dates.ipynb) 67 | 68 | ## Scientific Python Packages 69 | - NumPy 70 | - Matplotlib 71 | - [Basic Line Plots](http://nbviewer.jupyter.org/github/Unidata/online-python-training/blob/master/notebooks/Beginning%20Plots%20With%20Matplotlib.ipynb) 72 | - netCDF 73 | - CartoPy 74 | 75 | ## Python for Meteorology 76 | - Siphon 77 | - Metpy 78 | 79 | ### Support or Contact 80 | - [Unidata Python Support](support.html) 81 | -------------------------------------------------------------------------------- /notebook.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: How to Start and Run a Jupyter Notebook 3 | --- 4 | 5 | # How to Start and Run a Jupyter Notebook 6 | 7 | As discussed in the [introduction](introduction.html), Jupyter notebooks provide a tremendous advantage for scientific computing, analysis and visualization. Here, we will explain how to start a Jupyter notebook. We will present just enough information to get you started. For a more complete treatment of Jupyter notebook software, please read the [official documentation](https://jupyter-notebook.readthedocs.org/en/latest/). 8 | 9 | In the previous section, we explained how to download and install a complete Python installation with Anaconda for both [Mac OS X](conda-osx.html) and [Windows](conda-windows.html). Armed with this experience, we will demonstrate how to start a Jupyter notebook in order to run code. 10 | 11 | The Jupyter Notebook software is included in the Python installation we obtained from Anaconda. There are at least two scenarios in which you may want to run a Jupyter notebook: 12 | 13 | 1. You aim to further experiment with, or augment, an existing Jupyter notebook like the ones that already exist within a repository in github. 14 | 2. You want to develop a Jupyter notebook or series of notebooks for uses such as supplementing teaching material, or for a scholarly journal article, for example. 15 | 16 | In both cases, you will want to start the Jupyter notebook in a specific folder. 17 | 18 | ### Starting a Jupyter Notebook in a Specific Folder 19 | 20 | On Mac OS X, create a Desktop folder with the Finder called `my-notebook`. [In the last section](conda-osx.html), we learned how to start the OS X Terminal. Launch the Terminal again so that we may start Jupyter. Change to that directory (i.e., open the newly created `my-notebook` folder) with the `cd` command: `cd ~/Desktop/my-notebook`. The `~` character is a shortcut to indicate you are at your home directory. 21 | 22 | On Windows, [create a Desktop folder](http://windows.microsoft.com/en-us/windows/create-new-folder) called `my-notebook`. Hold down the shift key and right-click on the newly created folder. A context menu will appear and there will be an option to, "Open command window here". Click this option to launch the Windows Command Prompt at that specific location. 23 | 24 | We can now start our Jupyter notebook with this command: 25 | 26 | jupyter notebook 27 | 28 | Once entered, this command will automatically launch your default web browser with a new notebook in an empty directory. 29 | 30 | To actually create a notebook, go to the New, Python 3 menu item. 31 | 32 | Enter some code in the first cell: 33 | 34 | print("hello world") 35 | 36 | and press Shift-Enter to actually run the cell yielding 37 | 38 | hello world 39 | 40 | 41 | Starting Jupyter 42 | 43 | For more information on the basics of using the Jupyter Notebook, we recommend starting with this notebook on [Notebook Basics](https://nbviewer.jupyter.org/github/jupyter/notebook/blob/master/docs/source/examples/Notebook/Notebook%20Basics.ipynb). 44 | 45 | ### How to Run OPT Jupyter Notebooks 46 | 47 | This project includes a [series of Jupyter notebooks](http://unidata.github.io/online-python-training/index.html#beginning-python-concepts) for learning Python with geoscience objectives. They are located in the `notebooks` folder in the git `master` branch. In order to clone this project or any projects containing Jupyter notebooks such as the [Unidata Python Workshop](https://github.com/Unidata/unidata-python-workshop), please see the [section on git and github](http://unidata.github.io/online-python-training/index.html#getting-started). Once you have cloned your repository, change directory to where the Jupyter notebooks are located in the repository folder (e.g., the `notebooks` directory) and start Jupyter with the `jupyter notebook` command. 48 | 49 | ## MyBinder and Starting your Jupyter Notebook in the Cloud 50 | 51 | MyBinder is a third option that runs Jupyter notebooks on a cloud server that is setup on your behalf. If the project has enabled MyBinder, you will see a MyBinder badge on the github project page. MyBinder is available for the Unidata Python Workshop Jupyter notebooks at [this link](https://github.com/Unidata/unidata-python-workshop). See the [MyBinder](http://mybinder.org/) website for more information. 52 | -------------------------------------------------------------------------------- /stylesheets/print.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, ol, ul, li, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | padding: 0; 15 | margin: 0; 16 | font: inherit; 17 | font-size: 100%; 18 | vertical-align: baseline; 19 | border: 0; 20 | } 21 | /* HTML5 display-role reset for older browsers */ 22 | article, aside, details, figcaption, figure, 23 | footer, header, hgroup, menu, nav, section { 24 | display: block; 25 | } 26 | body { 27 | line-height: 1; 28 | } 29 | ol, ul { 30 | list-style: none; 31 | } 32 | blockquote, q { 33 | quotes: none; 34 | } 35 | blockquote:before, blockquote:after, 36 | q:before, q:after { 37 | content: ''; 38 | content: none; 39 | } 40 | table { 41 | border-spacing: 0; 42 | border-collapse: collapse; 43 | } 44 | body { 45 | font-family: 'Helvetica Neue', Helvetica, Arial, serif; 46 | font-size: 13px; 47 | line-height: 1.5; 48 | color: #000; 49 | } 50 | 51 | a { 52 | font-weight: bold; 53 | color: #d5000d; 54 | } 55 | 56 | header { 57 | padding-top: 35px; 58 | padding-bottom: 10px; 59 | } 60 | 61 | header h1 { 62 | font-size: 48px; 63 | font-weight: bold; 64 | line-height: 1.2; 65 | color: #303030; 66 | letter-spacing: -1px; 67 | } 68 | 69 | header h2 { 70 | font-size: 24px; 71 | font-weight: normal; 72 | line-height: 1.3; 73 | color: #aaa; 74 | letter-spacing: -1px; 75 | } 76 | #downloads { 77 | display: none; 78 | } 79 | #main_content { 80 | padding-top: 20px; 81 | } 82 | 83 | code, pre { 84 | margin-bottom: 30px; 85 | font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal; 86 | font-size: 12px; 87 | color: #222; 88 | } 89 | 90 | code { 91 | padding: 0 3px; 92 | } 93 | 94 | pre { 95 | padding: 20px; 96 | overflow: auto; 97 | border: solid 1px #ddd; 98 | } 99 | pre code { 100 | padding: 0; 101 | } 102 | 103 | ul, ol, dl { 104 | margin-bottom: 20px; 105 | } 106 | 107 | 108 | /* COMMON STYLES */ 109 | 110 | table { 111 | width: 100%; 112 | border: 1px solid #ebebeb; 113 | } 114 | 115 | th { 116 | font-weight: 500; 117 | } 118 | 119 | td { 120 | font-weight: 300; 121 | text-align: center; 122 | border: 1px solid #ebebeb; 123 | } 124 | 125 | form { 126 | padding: 20px; 127 | background: #f2f2f2; 128 | 129 | } 130 | 131 | 132 | /* GENERAL ELEMENT TYPE STYLES */ 133 | 134 | h1 { 135 | font-size: 2.8em; 136 | } 137 | 138 | h2 { 139 | margin-bottom: 8px; 140 | font-size: 22px; 141 | font-weight: bold; 142 | color: #303030; 143 | } 144 | 145 | h3 { 146 | margin-bottom: 8px; 147 | font-size: 18px; 148 | font-weight: bold; 149 | color: #d5000d; 150 | } 151 | 152 | h4 { 153 | font-size: 16px; 154 | font-weight: bold; 155 | color: #303030; 156 | } 157 | 158 | h5 { 159 | font-size: 1em; 160 | color: #303030; 161 | } 162 | 163 | h6 { 164 | font-size: .8em; 165 | color: #303030; 166 | } 167 | 168 | p { 169 | margin-bottom: 20px; 170 | font-weight: 300; 171 | } 172 | 173 | a { 174 | text-decoration: none; 175 | } 176 | 177 | p a { 178 | font-weight: 400; 179 | } 180 | 181 | blockquote { 182 | padding: 0 0 0 30px; 183 | margin-bottom: 20px; 184 | font-size: 1.6em; 185 | border-left: 10px solid #e9e9e9; 186 | } 187 | 188 | ul li { 189 | padding-left: 20px; 190 | list-style-position: inside; 191 | list-style: disc; 192 | } 193 | 194 | ol li { 195 | padding-left: 3px; 196 | list-style-position: inside; 197 | list-style: decimal; 198 | } 199 | 200 | dl dd { 201 | font-style: italic; 202 | font-weight: 100; 203 | } 204 | 205 | footer { 206 | padding-top: 20px; 207 | padding-bottom: 30px; 208 | margin-top: 40px; 209 | font-size: 13px; 210 | color: #aaa; 211 | } 212 | 213 | footer a { 214 | color: #666; 215 | } 216 | 217 | /* MISC */ 218 | .clearfix:after { 219 | display: block; 220 | height: 0; 221 | clear: both; 222 | visibility: hidden; 223 | content: '.'; 224 | } 225 | 226 | .clearfix {display: inline-block;} 227 | * html .clearfix {height: 1%;} 228 | .clearfix {display: block;} 229 | -------------------------------------------------------------------------------- /conda-windows.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Getting Going with Python on a Windows 3 | --- 4 | 5 | # Getting Going with Python on a Windows 6 | 7 | The aim of this web page is to help you get started with Python on Windows. We will explain what a package management tool is, how to download `conda` package management tool via the Anaconda installer, and guide you on the Windows Command Prompt so that you can use `conda` from the command line. Finally, we will wrap up by installing one library with `conda`. 8 | 9 | ## What Is a Package Management Tool? 10 | 11 | A package management tool is a software application that helps you manage software libraries that enable you to get your work done. These software libraries may relate to plotting for scientific publication or accessing certain kinds of data, for example. 12 | 13 | When you start using Python, you will want use software libraries that are not part of the standard Python installation. For example, you may wish to use the [Unidata metpy library](https://pypi.python.org/pypi/MetPy) for meteorological data and visualization. Anaconda from Continuum Analytics will help you install `metpy` easily. 14 | 15 | ## Installing the `conda` Package Management Tool 16 | 17 | The `conda` package management tool is part of the Anaconda software package. Install `conda` by navigating to the [Anaconda download page](https://www.anaconda.com/distribution/). Scroll down to the "Anaconda for Windows" portion of the web page. 18 | 19 | Download the Python 3.5 version by clicking on the "Windows 64 bit Graphical Installer" link. It is a big download, so it is best to be on fast network. Open the installer file you just downloaded. It should be named something like `Anaconda[version]-Windows-x86_64`. 20 | 21 | This action will guide you through the [conda installation on Windows](https://docs.continuum.io/anaconda/install#anaconda-for-windows-install). The last step of the installation process will ask you if you want to add Anaconda to my the PATH environment variable. Ensure this option is checked. 22 | 23 | ## Windows Command Prompt 24 | 25 | The Windows Command Prompt is a software program that gives you the ability to give text based instructions to your computer. 26 | 27 | To open the Windows Command Prompt, left-click on the Windows Start menu located in the lower left portion of the desktop and search for 'Command Prompt' in the search box located at the bottom of the menu. 28 | 29 | In the Windows Command Prompt, you will see some text such as **`C:\Users\Jane>`**. This is known as the **command line**. The command line is where you give text instructions to your computer. 30 | 31 | ## Interacting with `conda` 32 | 33 | Let's make sure conda is installed by entering this instruction on the command line: 34 | 35 | conda list 36 | 37 | yields 38 | 39 | # packages in environment at C:\Users\Jane\AppData\Local\Continuum\Anaconda3: 40 | # 41 | alabaster 0.7.7 py35_0 42 | anaconda 4.0.0 np110py35_0 43 | anaconda-client 1.4.0 py35_0 44 | ... 45 | numexpr 2.5 np110py35_0 46 | numpy 1.10.4 py35_0 47 | odo 0.4.2 py35_0 48 | ... 49 | yaml 0.1.6 0 50 | zeromq 4.1.3 0 51 | zlib 1.2.8 0 52 | 53 | which will list linked packages in a conda environment. You’ll notice libraries such as the scientific computing library [numpy](http://www.numpy.org/) that you will probably be making use of. 54 | 55 | ## Getting Our Feet Wet by Installing Metpy with `conda` 56 | 57 | We first have to give `conda` an instruction on where to find `metpy` on the `conda-forge` channel. 58 | 59 | conda config --add channels conda-forge 60 | 61 | We can now install `metpy`: 62 | 63 | conda install metpy 64 | 65 | Let's verify we installed `metpy` with the following command: 66 | 67 | conda list 68 | 69 | should yield amongst other libraries: 70 | 71 | # packages in environment at /Users/chastang/anaconda: 72 | # 73 | ... 74 | metpy 0.3.0 py35_1 conda-forge 75 | ... 76 | 77 | ## In Summary 78 | 79 | You have just learned how to: 80 | 81 | - Download `conda` 82 | - Install `conda` 83 | - Installed the `metpy` library with `conda` 84 | 85 | In future installments of the Unidata Online Python training, we will be using `conda` to install various libraries. 86 | -------------------------------------------------------------------------------- /conda-osx.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Getting Going with Python on Mac OS X 3 | --- 4 | 5 | # Getting Going with Python on Mac OS X 6 | 7 | The aim of this web page is to help you get started with Python on Mac OS X. We will explain what a package management tool is, how to download `conda` package management tool via the Anaconda installer, and guide you on the OS X Terminal application so that you can use `conda` from the command line. Finally, we will wrap up by installing one library with `conda`. 8 | 9 | ## What Is a Package Management Tool? 10 | 11 | A package management tool is a software application that helps you manage software libraries that enable you to get your work done. These software libraries may relate to plotting for scientific publication or accessing certain kinds of data, for example. 12 | 13 | When you start using Python, you will want use software libraries that are not part of the standard Python installation. For example, you may wish to use the [Unidata metpy library](https://pypi.python.org/pypi/MetPy) for meteorological data and visualization. Anaconda from Continuum Analytics will help you install `metpy` easily. 14 | 15 | ## Installing the `conda` Package Management Tool 16 | 17 | The `conda` package management tool is part of the Anaconda software package. Install `conda` by navigating to the [Anaconda download page](https://www.anaconda.com/distribution/). Scroll down to the "Anaconda for OS X" portion of the web page. 18 | 19 | Download the Python 3.5 version by clicking on the "Mac OS X 64 bit Graphical Installer" link. It is a big download, so it is best to be on fast network. Open the installer file you just downloaded. It should be named something like `Anaconda[version]-MacOSX-x86_64.pkg`. 20 | 21 | This action will guide you through the [conda installation on your Mac](https://docs.continuum.io/anaconda/install#anaconda-for-os-x-graphical-install). The second "Read Me" step is important, as the installation will make some modifications that the OS X Terminal application can make use of. We cover the OS X Terminal next. 22 | 23 | Anaconda Installer 24 | 25 | ## OS X Terminal Application 26 | 27 | The OS X Terminal is a software program that gives you the ability to give text based instructions to your computer. As you make progress in geoscientific programming, you will probably use the Terminal a lot, so it will benefit you to become familiar with it. 28 | 29 | For this exercise we will open up the Terminal by going to the OS X Finder and navigating to the Application, Utilities folder. There you will find the Terminal application which you can double click on to launch. 30 | 31 | OS X Terminal 32 | 33 | In the Terminal application, you will see a character such as **`$`** symbol known as the **command line**. The command line is where you give text instructions to your computer. 34 | 35 | ## Interacting with `conda` 36 | 37 | Let's make sure conda is installed by entering this instruction on the command line: 38 | 39 | conda list 40 | 41 | yields 42 | 43 | # packages in environment at /Users/chastang/anaconda: 44 | # 45 | alabaster 0.7.7 py35_0 46 | anaconda 4.0.0 np110py35_0 47 | anaconda-client 1.4.0 py35_0 48 | ... 49 | numexpr 2.5 np110py35_0 50 | numpy 1.10.4 py35_0 51 | odo 0.4.2 py35_0 52 | ... 53 | yaml 0.1.6 0 54 | zeromq 4.1.3 0 55 | zlib 1.2.8 0 56 | 57 | which will list linked packages in a conda environment. You’ll notice libraries such as the scientific computing library [numpy](http://www.numpy.org/) that you will probably be making use of. 58 | 59 | ### If You Have Problems with `conda list` 60 | 61 | If `conda list` worked without trouble, skip this subsection. If that last `conda list` command gave you an error, it is possible that you are running the wrong flavor of the OS X Terminal (or more precisely the wrong Unix shell). Ensure you are running the `bash` shell by going to Terminal, Preferences… menu, and verifying that `/bin/bash` is selected. If you change it, please quit, and restart the Terminal application. 62 | 63 | /bin/bash 64 | 65 | ## Getting Our Feet Wet by Installing Metpy with `conda` 66 | 67 | We first have to give `conda` an instruction on where to find `metpy` on the `conda-forge` channel. 68 | 69 | conda config --add channels conda-forge 70 | 71 | We can now install `metpy`: 72 | 73 | conda install metpy 74 | 75 | Let's verify we installed `metpy` with the following command: 76 | 77 | conda list 78 | 79 | should yield amongst other libraries: 80 | 81 | # packages in environment at /Users/chastang/anaconda: 82 | # 83 | ... 84 | metpy 0.3.0 py35_1 conda-forge 85 | ... 86 | 87 | ## In Summary 88 | 89 | You have just learned how to: 90 | 91 | - Download `conda` 92 | - Install `conda` 93 | - Installed the `metpy` library with `conda` 94 | 95 | In future installments of the Unidata Online Python training, we will be using `conda` to install various libraries. 96 | -------------------------------------------------------------------------------- /introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Why Python and Jupyter Notebooks? 3 | --- 4 | # Why Python and Jupyter Notebooks? 5 | 6 | ## Jupyter Notebooks 7 | 8 | One of the most significant advances in the scientific computing arena is underway with the explosion of interest in Jupyter (formerly, IPython) Notebook technology. The scientific publication *Nature* recently featured [an article on the benefits of Jupyter Notebooks](http://www.nature.com/news/interactive-notebooks-sharing-the-code-1.16261) for scientific research. There are now Jupyter Notebooks on numerous topics in many scientific disciplines. Here are a few examples of IPython Notebooks for science: 9 | 10 | - [LIGO Gravitational Wave Data](https://losc.ligo.org/s/events/GW150914/GW150914_tutorial.html) 11 | - [Satellite Imagery Analysis](http://unidata.github.io/python-gallery/examples/Satellite_Example.html) 12 | - [12 Steps to Navier-Stokes](https://github.com/barbagroup/CFDPython) 13 | - [Computer Vision](http://nbviewer.jupyter.org/github/ogrisel/notebooks/blob/master/Labeled%2520Faces%2520in%2520the%2520Wild%2520recognition.ipynb) 14 | - [Machine Learning](https://nbviewer.jupyter.org/github/rhiever/Data-Analysis-and-Machine-Learning-Projects/blob/master/example-data-science-notebook/Example%2520Machine%2520Learning%2520Notebook.ipynb) 15 | 16 | The reason for Jupyter's immense success is it excels in a form of programming called "literate programming". Literate programming is a software development style pioneered by Stanford computer scientist, Donald Knuth. This type of programming emphasizes a prose first approach where exposition with human-friendly text is punctuated with code blocks. It excels at demonstration, research, and teaching objectives especially for science. Literate programming allows users to formulate and describe their thoughts with prose, supplemented by mathematical equations, as they prepare to write code blocks. This mindset is the opposite of how we usually think about code. Over the years, we have seen closed-source, for-profit implementations of literate programming with software packages such as Mathematica, and Matlab. 17 | 18 | Brian Granger and Fernando Pérez created the IPython (now "Jupyter") Notebooks web-based technology because of the clear advantages of literate programming and improved web browser technologies (e.g., HTML5). IPython Notebooks relieved the paucity of open-source options. Jupyter notebooks are a series of "cells" containing executable code, or markdown, the popular HTML markup language for prose descriptions. They have LaTeX support for mathematical equations with [MathJax](https://www.mathjax.org/), a web browser enhancement for display of mathematics. These notebooks can be saved and easily shared in `.ipynb` JSON format. They can also be committed to version control repositories such as git and the code sharing site github. (See the [Getting Started, Github section](index.html) for an introduction to git and version control.) Jupyter notebooks can be viewed with [nbviewer technology](http://nbviewer.jupyter.org/) which github supports. Moreover, because these notebook environments are for writing and developing code, they offer many niceties available in typical Interactive Development Environments (IDEs) such as code completion and easy access to help. 19 | 20 | For a bit of history, IPython notebooks quickly gained popularity and in 2013 the IPython team won a [Sloan Foundation Grant](http://ipython.org/sloan-grant.html) to accelerate development of this technology. The IPython Notebook concept was expanded upon to allow for additional programming languages and was therefore renamed "Jupyter". "Jupyter" is a loose acronym meaning Julia, Python and R, but today, the notebook technology supports [many programming languages](https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages). For more information on Jupyter notebooks see the [How to Start and Run a Jupyter Notebook section](notebook.html). 21 | 22 | ## Python and IPython 23 | 24 | Before getting into "What is Python?", the advantages of Python were once succinctly summarized by a UCAR scientist: 25 | 26 | > I have used a combination of Perl, Fortran, NCL, Matlab, R and others for 27 | > routine research, but found out this general- purpose language, Python, can 28 | > handle almost all in an efficient way from requesting data from remote online 29 | > sites to statistics, and graphics. 30 | 31 | ### What Is Python? 32 | 33 | Python is a "batteries included" computer programming language. More concretely, Python is a programming language 34 | that, in contrast to other programming languages such as C, Fortran, or Java, allows users to more readily focus and solve domain problems instead of dealing with the complexity of how a computer operates. Python achieves this goal by having the following attributes: 35 | 36 | - Python is a **high-level** language, meaning that it abstracts underlying computer-related technical details. For example, Python does not make its users think too much about computer memory management or proper declaration of variables and uses safe assumptions about what the programmer is trying to convey. In addition, a high-level language can be expressed in a manner closer to English prose or mathematical equations. Python is perfect for literate programming because of its lightweight, "low ceremony" nature. 37 | - Python is a **general-purpose** language meaning that it can be used for all problems that a computer is capable of rather than specializing in a specific area such as statistical analysis. For example, Python can be used for both artificial intelligence and statistical analysis. Python can be used for a variety of heterogeneous tasks within a given work-flow, as the UCAR scientist described earlier. 38 | - Python is an **interpreted** language meaning that evaluation of code to obtain results can happen immediately rather than having to go through a time-consuming, compile and run cycle, which thereby speeds up the thinking and experimentation processes. IPython is an interactive form of the Python language also invented by Fernando Pérez. These environments excel for rapid-prototype of code or quick and simple experimentation with new ideas. 39 | - Python has a standard library, and numerous third-party libraries yielding a vast array of existing codebases and examples for solving problems. 40 | - Python has many, many users which means that programmers can quickly find solutions and example code to problems with the help of Google and [Stackoverflow](https://www.stackoverflow.com). 41 | 42 | These features, perhaps, come with a minor cost of reduced language performance, but this is a trade-off the vast majority of users are willing to make in order to gain all the advantages Python has to offer. 43 | 44 | In addition, Python has a rich ecosystem for scientific inquiry in the form of many proven, and popular open-source packages including: 45 | 46 | - [numpy](http://www.numpy.org/), a Python package for scientific computing 47 | - [matplotlib](http://matplotlib.org/), 2D plotting library which produces publication quality figures 48 | - [cartopy](http://scitools.org.uk/cartopy/), library providing cartographic tools for Python 49 | - [netcdf4-python](http://unidata.github.io/netcdf4-python/), a Python interface to the netCDF-C library 50 | 51 | In summary, Python's pragmatic focus for getting work done makes it an excellent choice for science students and professionals. 52 | -------------------------------------------------------------------------------- /stylesheets/stylesheet.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ 2 | 3 | /** 4 | * 1. Set default font family to sans-serif. 5 | * 2. Prevent iOS text size adjust after orientation change, without disabling 6 | * user zoom. 7 | */ 8 | 9 | html { 10 | font-family: sans-serif; /* 1 */ 11 | -webkit-text-size-adjust: 100%; /* 2 */ 12 | -ms-text-size-adjust: 100%; /* 2 */ 13 | } 14 | 15 | /** 16 | * Remove default margin. 17 | */ 18 | 19 | body { 20 | margin: 0; 21 | } 22 | 23 | /* HTML5 display definitions 24 | ========================================================================== */ 25 | 26 | /** 27 | * Correct `block` display not defined for any HTML5 element in IE 8/9. 28 | * Correct `block` display not defined for `details` or `summary` in IE 10/11 29 | * and Firefox. 30 | * Correct `block` display not defined for `main` in IE 11. 31 | */ 32 | 33 | article, 34 | aside, 35 | details, 36 | figcaption, 37 | figure, 38 | footer, 39 | header, 40 | hgroup, 41 | main, 42 | menu, 43 | nav, 44 | section, 45 | summary { 46 | display: block; 47 | } 48 | 49 | /** 50 | * 1. Correct `inline-block` display not defined in IE 8/9. 51 | * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. 52 | */ 53 | 54 | audio, 55 | canvas, 56 | progress, 57 | video { 58 | display: inline-block; /* 1 */ 59 | vertical-align: baseline; /* 2 */ 60 | } 61 | 62 | /** 63 | * Prevent modern browsers from displaying `audio` without controls. 64 | * Remove excess height in iOS 5 devices. 65 | */ 66 | 67 | audio:not([controls]) { 68 | display: none; 69 | height: 0; 70 | } 71 | 72 | /** 73 | * Address `[hidden]` styling not present in IE 8/9/10. 74 | * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. 75 | */ 76 | 77 | [hidden], 78 | template { 79 | display: none; 80 | } 81 | 82 | /* Links 83 | ========================================================================== */ 84 | 85 | /** 86 | * Remove the gray background color from active links in IE 10. 87 | */ 88 | 89 | a { 90 | background-color: transparent; 91 | } 92 | 93 | /** 94 | * Improve readability when focused and also mouse hovered in all browsers. 95 | */ 96 | 97 | a:active, 98 | a:hover { 99 | outline: 0; 100 | } 101 | 102 | /* Text-level semantics 103 | ========================================================================== */ 104 | 105 | /** 106 | * Address styling not present in IE 8/9/10/11, Safari, and Chrome. 107 | */ 108 | 109 | abbr[title] { 110 | border-bottom: 1px dotted; 111 | } 112 | 113 | /** 114 | * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. 115 | */ 116 | 117 | b, 118 | strong { 119 | font-weight: bold; 120 | } 121 | 122 | /** 123 | * Address styling not present in Safari and Chrome. 124 | */ 125 | 126 | dfn { 127 | font-style: italic; 128 | } 129 | 130 | /** 131 | * Address variable `h1` font-size and margin within `section` and `article` 132 | * contexts in Firefox 4+, Safari, and Chrome. 133 | */ 134 | 135 | h1 { 136 | margin: 0.67em 0; 137 | font-size: 2em; 138 | } 139 | 140 | /** 141 | * Address styling not present in IE 8/9. 142 | */ 143 | 144 | mark { 145 | color: #000; 146 | background: #ff0; 147 | } 148 | 149 | /** 150 | * Address inconsistent and variable font size in all browsers. 151 | */ 152 | 153 | small { 154 | font-size: 80%; 155 | } 156 | 157 | /** 158 | * Prevent `sub` and `sup` affecting `line-height` in all browsers. 159 | */ 160 | 161 | sub, 162 | sup { 163 | position: relative; 164 | font-size: 75%; 165 | line-height: 0; 166 | vertical-align: baseline; 167 | } 168 | 169 | sup { 170 | top: -0.5em; 171 | } 172 | 173 | sub { 174 | bottom: -0.25em; 175 | } 176 | 177 | /* Embedded content 178 | ========================================================================== */ 179 | 180 | /** 181 | * Remove border when inside `a` element in IE 8/9/10. 182 | */ 183 | 184 | img { 185 | border: 0; 186 | } 187 | 188 | /** 189 | * Correct overflow not hidden in IE 9/10/11. 190 | */ 191 | 192 | svg:not(:root) { 193 | overflow: hidden; 194 | } 195 | 196 | /* Grouping content 197 | ========================================================================== */ 198 | 199 | /** 200 | * Address margin not present in IE 8/9 and Safari. 201 | */ 202 | 203 | figure { 204 | margin: 1em 40px; 205 | } 206 | 207 | /** 208 | * Address differences between Firefox and other browsers. 209 | */ 210 | 211 | hr { 212 | height: 0; 213 | -moz-box-sizing: content-box; 214 | box-sizing: content-box; 215 | } 216 | 217 | /** 218 | * Contain overflow in all browsers. 219 | */ 220 | 221 | pre { 222 | overflow: auto; 223 | } 224 | 225 | /** 226 | * Address odd `em`-unit font size rendering in all browsers. 227 | */ 228 | 229 | code, 230 | kbd, 231 | pre, 232 | samp { 233 | font-family: monospace, monospace; 234 | font-size: 1em; 235 | } 236 | 237 | /* Forms 238 | ========================================================================== */ 239 | 240 | /** 241 | * Known limitation: by default, Chrome and Safari on OS X allow very limited 242 | * styling of `select`, unless a `border` property is set. 243 | */ 244 | 245 | /** 246 | * 1. Correct color not being inherited. 247 | * Known issue: affects color of disabled elements. 248 | * 2. Correct font properties not being inherited. 249 | * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. 250 | */ 251 | 252 | button, 253 | input, 254 | optgroup, 255 | select, 256 | textarea { 257 | margin: 0; /* 3 */ 258 | font: inherit; /* 2 */ 259 | color: inherit; /* 1 */ 260 | } 261 | 262 | /** 263 | * Address `overflow` set to `hidden` in IE 8/9/10/11. 264 | */ 265 | 266 | button { 267 | overflow: visible; 268 | } 269 | 270 | /** 271 | * Address inconsistent `text-transform` inheritance for `button` and `select`. 272 | * All other form control elements do not inherit `text-transform` values. 273 | * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. 274 | * Correct `select` style inheritance in Firefox. 275 | */ 276 | 277 | button, 278 | select { 279 | text-transform: none; 280 | } 281 | 282 | /** 283 | * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 284 | * and `video` controls. 285 | * 2. Correct inability to style clickable `input` types in iOS. 286 | * 3. Improve usability and consistency of cursor style between image-type 287 | * `input` and others. 288 | */ 289 | 290 | button, 291 | html input[type="button"], /* 1 */ 292 | input[type="reset"], 293 | input[type="submit"] { 294 | -webkit-appearance: button; /* 2 */ 295 | cursor: pointer; /* 3 */ 296 | } 297 | 298 | /** 299 | * Re-set default cursor for disabled elements. 300 | */ 301 | 302 | button[disabled], 303 | html input[disabled] { 304 | cursor: default; 305 | } 306 | 307 | /** 308 | * Remove inner padding and border in Firefox 4+. 309 | */ 310 | 311 | button::-moz-focus-inner, 312 | input::-moz-focus-inner { 313 | padding: 0; 314 | border: 0; 315 | } 316 | 317 | /** 318 | * Address Firefox 4+ setting `line-height` on `input` using `!important` in 319 | * the UA stylesheet. 320 | */ 321 | 322 | input { 323 | line-height: normal; 324 | } 325 | 326 | /** 327 | * It's recommended that you don't attempt to style these elements. 328 | * Firefox's implementation doesn't respect box-sizing, padding, or width. 329 | * 330 | * 1. Address box sizing set to `content-box` in IE 8/9/10. 331 | * 2. Remove excess padding in IE 8/9/10. 332 | */ 333 | 334 | input[type="checkbox"], 335 | input[type="radio"] { 336 | box-sizing: border-box; /* 1 */ 337 | padding: 0; /* 2 */ 338 | } 339 | 340 | /** 341 | * Fix the cursor style for Chrome's increment/decrement buttons. For certain 342 | * `font-size` values of the `input`, it causes the cursor style of the 343 | * decrement button to change from `default` to `text`. 344 | */ 345 | 346 | input[type="number"]::-webkit-inner-spin-button, 347 | input[type="number"]::-webkit-outer-spin-button { 348 | height: auto; 349 | } 350 | 351 | /** 352 | * 1. Address `appearance` set to `searchfield` in Safari and Chrome. 353 | * 2. Address `box-sizing` set to `border-box` in Safari and Chrome 354 | * (include `-moz` to future-proof). 355 | */ 356 | 357 | input[type="search"] { 358 | -webkit-box-sizing: content-box; /* 2 */ 359 | -moz-box-sizing: content-box; 360 | box-sizing: content-box; 361 | -webkit-appearance: textfield; /* 1 */ 362 | } 363 | 364 | /** 365 | * Remove inner padding and search cancel button in Safari and Chrome on OS X. 366 | * Safari (but not Chrome) clips the cancel button when the search input has 367 | * padding (and `textfield` appearance). 368 | */ 369 | 370 | input[type="search"]::-webkit-search-cancel-button, 371 | input[type="search"]::-webkit-search-decoration { 372 | -webkit-appearance: none; 373 | } 374 | 375 | /** 376 | * Define consistent border, margin, and padding. 377 | */ 378 | 379 | fieldset { 380 | padding: 0.35em 0.625em 0.75em; 381 | margin: 0 2px; 382 | border: 1px solid #c0c0c0; 383 | } 384 | 385 | /** 386 | * 1. Correct `color` not being inherited in IE 8/9/10/11. 387 | * 2. Remove padding so people aren't caught out if they zero out fieldsets. 388 | */ 389 | 390 | legend { 391 | padding: 0; /* 2 */ 392 | border: 0; /* 1 */ 393 | } 394 | 395 | /** 396 | * Remove default vertical scrollbar in IE 8/9/10/11. 397 | */ 398 | 399 | textarea { 400 | overflow: auto; 401 | } 402 | 403 | /** 404 | * Don't inherit the `font-weight` (applied by a rule above). 405 | * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. 406 | */ 407 | 408 | optgroup { 409 | font-weight: bold; 410 | } 411 | 412 | /* Tables 413 | ========================================================================== */ 414 | 415 | /** 416 | * Remove most spacing between table cells. 417 | */ 418 | 419 | table { 420 | border-spacing: 0; 421 | border-collapse: collapse; 422 | } 423 | 424 | td, 425 | th { 426 | padding: 0; 427 | } 428 | 429 | /* LAYOUT STYLES */ 430 | body { 431 | font-family: 'Droid Serif', 'Helvetica Neue', Helvetica, Arial, serif; 432 | font-size: 15px; 433 | font-weight: 400; 434 | line-height: 1.5; 435 | color: #666; 436 | background: #fafafa url(../images/body-bg.jpg) 0 0 repeat; 437 | } 438 | 439 | p { 440 | margin-top: 0; 441 | } 442 | 443 | a { 444 | color: #2879d0; 445 | } 446 | a:hover { 447 | color: #2268b2; 448 | } 449 | 450 | header { 451 | padding-top: 40px; 452 | padding-bottom: 40px; 453 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 454 | background: #0384A3 url(../images/header-bg-unidata.jpg) 0 0 repeat-x; 455 | border-bottom: solid 1px #275da1; 456 | } 457 | 458 | header h1 { 459 | width: 540px; 460 | margin-top: 0; 461 | margin-bottom: 0.2em; 462 | font-size: 72px; 463 | font-weight: normal; 464 | line-height: 1; 465 | color: #fff; 466 | letter-spacing: -1px; 467 | } 468 | 469 | header h2 { 470 | width: 540px; 471 | margin-top: 0; 472 | margin-bottom: 0; 473 | font-size: 26px; 474 | font-weight: normal; 475 | line-height: 1.3; 476 | color: #9ddcff; 477 | letter-spacing: 0; 478 | } 479 | 480 | .inner { 481 | position: relative; 482 | width: 940px; 483 | margin: 0 auto; 484 | } 485 | 486 | #content-wrapper { 487 | padding-top: 30px; 488 | border-top: solid 1px #fff; 489 | } 490 | 491 | #main-content { 492 | float: left; 493 | width: 690px; 494 | } 495 | 496 | #main-content img { 497 | max-width: 100%; 498 | } 499 | 500 | aside#sidebar { 501 | float: right; 502 | width: 200px; 503 | min-height: 504px; 504 | padding-left: 20px; 505 | font-size: 12px; 506 | line-height: 1.3; 507 | background: transparent url(../images/sidebar-bg.jpg) 0 0 no-repeat; 508 | } 509 | 510 | aside#sidebar p.repo-owner, 511 | aside#sidebar p.repo-owner a { 512 | font-weight: bold; 513 | } 514 | 515 | #downloads { 516 | margin-bottom: 40px; 517 | } 518 | 519 | a.button { 520 | width: 134px; 521 | height: 58px; 522 | padding-top: 22px; 523 | padding-left: 68px; 524 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 525 | font-size: 23px; 526 | line-height: 1.2; 527 | color: #fff; 528 | } 529 | a.button small { 530 | display: block; 531 | font-size: 11px; 532 | } 533 | header a.button { 534 | position: absolute; 535 | top: 0; 536 | right: 0; 537 | background: transparent url(../images/github-button.png) 0 0 no-repeat; 538 | } 539 | aside a.button { 540 | display: block; 541 | width: 138px; 542 | padding-left: 64px; 543 | margin-bottom: 20px; 544 | font-size: 21px; 545 | background: transparent url(../images/download-button.png) 0 0 no-repeat; 546 | } 547 | 548 | code, pre { 549 | margin-bottom: 30px; 550 | font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; 551 | font-size: 13px; 552 | color: #222; 553 | } 554 | 555 | code { 556 | padding: 0 3px; 557 | background-color: #f2f8fc; 558 | border: solid 1px #dbe7f3; 559 | } 560 | 561 | pre { 562 | padding: 20px; 563 | overflow: auto; 564 | text-shadow: none; 565 | background: #fff; 566 | border: solid 1px #f2f2f2; 567 | } 568 | pre code { 569 | padding: 0; 570 | color: #2879d0; 571 | background-color: #fff; 572 | border: none; 573 | } 574 | 575 | ul, ol, dl { 576 | margin-bottom: 20px; 577 | } 578 | 579 | 580 | /* COMMON STYLES */ 581 | 582 | hr { 583 | height: 0; 584 | margin-top: 1em; 585 | margin-bottom: 1em; 586 | border: 0; 587 | border-top: solid 1px #ddd; 588 | } 589 | 590 | table { 591 | width: 100%; 592 | border: 1px solid #ebebeb; 593 | } 594 | 595 | th { 596 | font-weight: 500; 597 | } 598 | 599 | td { 600 | font-weight: 300; 601 | text-align: center; 602 | border: 1px solid #ebebeb; 603 | } 604 | 605 | form { 606 | padding: 20px; 607 | background: #f2f2f2; 608 | 609 | } 610 | 611 | 612 | /* GENERAL ELEMENT TYPE STYLES */ 613 | 614 | #main-content h1 { 615 | margin-top: 0; 616 | margin-bottom: 0; 617 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 618 | font-size: 2.8em; 619 | font-weight: normal; 620 | color: #474747; 621 | text-indent: 6px; 622 | letter-spacing: -1px; 623 | } 624 | 625 | #main-content h1:before { 626 | padding-right: 0.3em; 627 | margin-left: -0.9em; 628 | color: #06778F; 629 | content: "/"; 630 | } 631 | 632 | #main-content h2 { 633 | margin-bottom: 8px; 634 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 635 | font-size: 22px; 636 | font-weight: bold; 637 | color: #474747; 638 | text-indent: 4px; 639 | } 640 | #main-content h2:before { 641 | padding-right: 0.3em; 642 | margin-left: -1.5em; 643 | content: "//"; 644 | color: #06778F; 645 | } 646 | 647 | #main-content h3 { 648 | margin-top: 24px; 649 | margin-bottom: 8px; 650 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 651 | font-size: 18px; 652 | font-weight: bold; 653 | color: #474747; 654 | text-indent: 3px; 655 | } 656 | 657 | #main-content h3:before { 658 | padding-right: 0.3em; 659 | margin-left: -2em; 660 | content: "///"; 661 | color: #06778F; 662 | } 663 | 664 | #main-content h4 { 665 | margin-bottom: 8px; 666 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 667 | font-size: 15px; 668 | font-weight: bold; 669 | color: #474747; 670 | text-indent: 3px; 671 | } 672 | 673 | h4:before { 674 | padding-right: 0.3em; 675 | margin-left: -2.8em; 676 | content: "////"; 677 | color: #9ddcff; 678 | } 679 | 680 | #main-content h5 { 681 | margin-bottom: 8px; 682 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 683 | font-size: 14px; 684 | color: #474747; 685 | text-indent: 3px; 686 | } 687 | h5:before { 688 | padding-right: 0.3em; 689 | margin-left: -3.2em; 690 | content: "/////"; 691 | color: #9ddcff; 692 | } 693 | 694 | #main-content h6 { 695 | margin-bottom: 8px; 696 | font-family: 'Ubuntu', 'Helvetica Neue', Helvetica, Arial, serif; 697 | font-size: .8em; 698 | color: #474747; 699 | text-indent: 3px; 700 | } 701 | h6:before { 702 | padding-right: 0.3em; 703 | margin-left: -3.7em; 704 | content: "//////"; 705 | color: #9ddcff; 706 | } 707 | 708 | p { 709 | margin-bottom: 20px; 710 | } 711 | 712 | a { 713 | text-decoration: none; 714 | } 715 | 716 | p a { 717 | font-weight: 400; 718 | } 719 | 720 | blockquote { 721 | padding: 0 0 0 30px; 722 | margin-bottom: 20px; 723 | font-size: 1.6em; 724 | border-left: 10px solid #e9e9e9; 725 | } 726 | 727 | ul { 728 | list-style-position: inside; 729 | list-style: disc; 730 | padding-left: 20px; 731 | } 732 | 733 | ol { 734 | list-style-position: inside; 735 | list-style: decimal; 736 | padding-left: 3px; 737 | } 738 | 739 | dl dd { 740 | font-style: italic; 741 | font-weight: 100; 742 | } 743 | 744 | footer { 745 | padding-top: 20px; 746 | padding-bottom: 30px; 747 | margin-top: 40px; 748 | font-size: 13px; 749 | color: #aaa; 750 | } 751 | 752 | footer a { 753 | color: #666; 754 | } 755 | footer a:hover { 756 | color: #444; 757 | } 758 | 759 | /* MISC */ 760 | .clearfix:after { 761 | display: block; 762 | height: 0; 763 | clear: both; 764 | visibility: hidden; 765 | content: '.'; 766 | } 767 | 768 | .clearfix {display: inline-block;} 769 | * html .clearfix {height: 1%;} 770 | .clearfix {display: block;} 771 | 772 | /* #Media Queries 773 | ================================================== */ 774 | 775 | /* Smaller than standard 960 (devices and browsers) */ 776 | @media only screen and (max-width: 959px) { } 777 | 778 | /* Tablet Portrait size to standard 960 (devices and browsers) */ 779 | @media only screen and (min-width: 768px) and (max-width: 959px) { 780 | .inner { 781 | width: 740px; 782 | } 783 | header h1, header h2 { 784 | width: 340px; 785 | } 786 | header h1 { 787 | font-size: 60px; 788 | } 789 | header h2 { 790 | font-size: 30px; 791 | } 792 | #main-content { 793 | width: 490px; 794 | } 795 | #main-content h1:before, 796 | #main-content h2:before, 797 | #main-content h3:before, 798 | #main-content h4:before, 799 | #main-content h5:before, 800 | #main-content h6:before { 801 | padding-right: 0; 802 | margin-left: 0; 803 | content: none; 804 | } 805 | } 806 | 807 | /* All Mobile Sizes (devices and browser) */ 808 | @media only screen and (max-width: 767px) { 809 | .inner { 810 | width: 93%; 811 | } 812 | header { 813 | padding: 20px 0; 814 | } 815 | header .inner { 816 | position: relative; 817 | } 818 | header h1, header h2 { 819 | width: 100%; 820 | } 821 | header h1 { 822 | font-size: 48px; 823 | } 824 | header h2 { 825 | font-size: 24px; 826 | } 827 | header a.button { 828 | position: relative; 829 | display: inline-block; 830 | width: auto; 831 | height: auto; 832 | padding: 5px 10px; 833 | margin-top: 15px; 834 | font-size: 13px; 835 | line-height: 1; 836 | color: #2879d0; 837 | text-align: center; 838 | background-color: #9ddcff; 839 | background-image: none; 840 | border-radius: 5px; 841 | -moz-border-radius: 5px; 842 | -webkit-border-radius: 5px; 843 | } 844 | header a.button small { 845 | display: inline; 846 | font-size: 13px; 847 | } 848 | #main-content, 849 | aside#sidebar { 850 | float: none; 851 | width: 100% ! important; 852 | } 853 | aside#sidebar { 854 | min-height: 0; 855 | padding: 20px 0; 856 | margin-top: 20px; 857 | background-image: none; 858 | border-top: solid 1px #ddd; 859 | } 860 | aside#sidebar a.button { 861 | display: none; 862 | } 863 | #main-content h1:before, 864 | #main-content h2:before, 865 | #main-content h3:before, 866 | #main-content h4:before, 867 | #main-content h5:before, 868 | #main-content h6:before { 869 | padding-right: 0; 870 | margin-left: 0; 871 | content: none; 872 | } 873 | } 874 | 875 | /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ 876 | @media only screen and (min-width: 480px) and (max-width: 767px) { } 877 | 878 | /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ 879 | @media only screen and (max-width: 479px) { } 880 | --------------------------------------------------------------------------------