├── .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 |
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
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 |
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 |
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 |
--------------------------------------------------------------------------------