├── .gitignore
├── .gitmodules
├── .sass-cache
├── 35ab4e3189d3927cf27f7341ea724e435bdd8d18
│ ├── _aside.scssc
│ ├── _content.scssc
│ ├── _footer.scssc
│ └── _header.scssc
└── 9ee78c3fd12bd2f190b552fca120fc16204e6cc8
│ ├── _layout.scssc
│ ├── _reset.scssc
│ ├── _syntax.scssc
│ ├── _utilities.scssc
│ └── _variables.scssc
├── 404.html
├── CNAME
├── Dockerfile
├── Gemfile
├── LICENSE
├── README.md
├── _config-dev.yml
├── _config.yml
├── _develop-site.sh
├── _docker-compose-dev.yml
├── _docker-compose-prod.yml
├── _includes
├── analytics.html
├── article-footer.html
├── article-header.html
├── contact-include.md
├── icons.html
├── page-url-resolver.html
└── share-buttons.html
├── _layouts
├── arc42-doc-section.html
├── default.html
├── index_default.html
├── page.html
└── post.html
├── _pages
├── categories.md
├── contact.md
├── home.md
├── imprint-privacy.md
├── keywords.html
├── references.md
├── search.html
├── sect-1-overall.md
├── sect-10-security.md
├── sect-11-microservices.md
├── sect-2-dataflow.md
├── sect-20-design.md
├── sect-3-interactive.md
├── sect-4-integration.md
├── sect-5-adaptive.md
├── sect-6-domain.md
├── sect-7-stability.md
├── sect-8-resource-management.md
└── sect-9-workflow.md
├── _posts
├── 01-overall
│ ├── 2017-03-01-layer.md
│ ├── 2017-03-02-client-server.md
│ ├── 2017-03-03-master-slave.md
│ ├── 2017-03-04-onion-style.md
│ ├── 2017-03-05-hexagonal-architecture.md
│ ├── 2017-03-06-transaction-script.md
│ ├── 2017-03-07-domain-model.md
│ └── 2017-03-08-virtual-machine.md
├── 02-dataflow
│ ├── 2017-02-01-batch-sequential.md
│ ├── 2017-02-02-pipes-filter.md
│ ├── 2017-02-03-data-centric.md
│ └── 2017-02-04-blackboard.md
├── 03-interactive
│ └── 2017-04-01-mvc.md
├── 04-integration
│ ├── 2016-05-01-file-transfer.md
│ ├── 2016-05-02-messaging.md
│ ├── 2016-05-03-rpc.md
│ ├── 2016-05-04-shared-database.md
│ └── 2016-05-05-publish-subscribe.md
├── 05-adaptive
│ ├── 2017-03-01-plugin.md
│ ├── 2017-03-02-broker.md
│ └── 2017-03-03-microservice.md
├── 07-stability
│ ├── 2016-06-01-timeout.md
│ └── 2016-06-02-circuit-breaker.md
└── 10-design
│ ├── 2016-10-01-adapter.md
│ ├── 2016-10-02-facade.md
│ └── 2016-10-03-proxy.md
├── _sass
├── _aside.scss
├── _common.scss
├── _content.scss
├── _footer.scss
├── _header.scss
└── base
│ ├── _layout.scss
│ ├── _reset.scss
│ ├── _syntax.scss
│ ├── _utilities.scss
│ └── _variables.scss
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── apple-touch-icon-precomposed.png
├── apple-touch-icon.png
├── arc42-logo.png
├── assets
├── css
│ ├── arc42-doc.css
│ ├── arc42-exclamation.svg
│ ├── help42.svg
│ └── style.scss
├── img
│ ├── arc42-favicon.svg
│ ├── arc42logosquare.png
│ ├── doc42icon.svg
│ ├── innoQ-logo-bw.png
│ └── ugly-404.png
├── js
│ ├── header-link.js
│ ├── script.js
│ └── search.js
└── lib
│ └── garand-sticky
│ └── jquery.sticky.js
├── browserconfig.xml
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── icon.png
├── images
├── arc42ByExample-small.png
├── contact-icon.png
├── faq-icon.png
└── patterns
│ ├── FileTransferIcon.gif
│ ├── MessagingIcon.gif
│ ├── adapter.jpg
│ ├── batch-sequential.svg
│ ├── broker.svg
│ ├── data-centric.svg
│ ├── facade.png
│ ├── hexagonal.svg
│ ├── layers.png
│ ├── master-slave.svg
│ ├── mvc-pattern.png
│ ├── pipes-and-filter.svg
│ ├── proxy.png
│ └── unix.svg
├── index.html
├── manifest.json
├── mstile-144x144.png
├── mstile-150x150.png
├── mstile-310x150.png
├── mstile-310x310.png
├── mstile-70x70.png
├── originals
├── ArcMuster-MVC.graffle
├── Architecture-Patterns-EN.graffle
│ ├── data.plist
│ ├── image2.gif
│ └── image4.tiff
└── logo
│ ├── patterns-42-logo.graffle
│ └── patterns-42-logo.png
├── safari-pinned-tab.svg
└── search.json
/.gitignore:
--------------------------------------------------------------------------------
1 | _site
2 | .sass-cache
3 | .sass*
4 | Gemfile.lock
5 | zz-site
6 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 |
2 | [submodule "_includes/subtle-ads"]
3 | path = _includes/subtle-ads
4 | url = https://github.com/arc42/subtle-ads/
5 |
--------------------------------------------------------------------------------
/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_aside.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_aside.scssc
--------------------------------------------------------------------------------
/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_content.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_content.scssc
--------------------------------------------------------------------------------
/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_footer.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_footer.scssc
--------------------------------------------------------------------------------
/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_header.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/35ab4e3189d3927cf27f7341ea724e435bdd8d18/_header.scssc
--------------------------------------------------------------------------------
/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_layout.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_layout.scssc
--------------------------------------------------------------------------------
/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_reset.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_reset.scssc
--------------------------------------------------------------------------------
/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_syntax.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_syntax.scssc
--------------------------------------------------------------------------------
/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_utilities.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_utilities.scssc
--------------------------------------------------------------------------------
/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_variables.scssc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/.sass-cache/9ee78c3fd12bd2f190b552fca120fc16204e6cc8/_variables.scssc
--------------------------------------------------------------------------------
/404.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: arc42-doc-section
3 | title: 404 Not Found
4 | permalink: 404.html
5 | hide: true
6 | share: false
7 | ---
8 |
9 |
Sorry...
10 |
11 | the page you requested wasn't found.
12 |
13 |
14 |
--------------------------------------------------------------------------------
/CNAME:
--------------------------------------------------------------------------------
1 | patterns.arc42.org
2 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ruby:2.3-alpine
2 |
3 | COPY Gemfile .
4 | COPY Gemfile.lock .
5 |
6 | RUN apk update && \
7 | apk add make gcc musl-dev nodejs python
8 | RUN bundle install
9 |
10 | WORKDIR /srv/jekyll
11 | EXPOSE 4000
12 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 | gem 'github-pages'
3 | gem 'jemoji'
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Attribution-ShareAlike 4.0 International License
2 | =================================================================
3 |
4 | Please see the full terms of this license at:
5 | https://creativecommons.org/licenses/by-sa/4.0/
6 |
7 |
8 | Copyright (c) 2016 Dr. Gernot Starke (the licensor)
9 |
10 | You are free to:
11 |
12 | * Share — copy and redistribute the material in any medium or format
13 | * Adapt — remix, transform, and build upon the material for any purpose, even commercially.
14 |
15 | The licensor cannot revoke these freedoms as long as you follow the license terms.
16 |
17 | No additional restrictions — You may not apply legal terms or technological measures that
18 | legally restrict others from doing anything the license permits.
19 |
20 |
21 | The above copyright notice and this permission notice shall be included in all
22 | copies or substantial portions of the material.
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # arc42 (mostly incomplete) guide to architecture patterns
4 |
5 | Here we collect definitions and brief explanations of some patterns that might be
6 | relevant for software architecture.
7 |
8 | It's powered by Jekyll and a modified TTSCK theme (see below).
9 |
10 | ## License
11 | As all of the arc42 content, this FAQ is free to use under a liberal Creative-Commons
12 | license:
13 |
14 | 
15 | This work is licensed under a
16 | [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
17 |
18 | ## How to contribute
19 |
20 | * open an issue in our issue tracker
21 | * fork the repo, fix bugs and send a pull request
22 |
23 |
24 | ## How to develop and maintain this site
25 |
26 | ### With Docker
27 |
28 | 1. Install docker
29 | 2. For development, run
30 | ```
31 | docker-compose up
32 | ```
33 |
34 | 3. A docker image will be built and the development-server will be started.
35 |
36 | 4. In case you want to publish the site, terminate the development server
37 | by pressing Ctrl-C in your shell and run `docker-compose down`. Then start
38 | a production build of the site:
39 | ```
40 | docker-compose -f docker-compose-prod.yml up
41 | ```
42 | The complete site will be generated into the folder `zz_site`- you
43 | may ftp or rcp this to your production webserver.
44 |
45 | ### With local installation
46 |
47 | 1. Install [Jekyll](http://jekyllrb.com/)
48 | 2. Checkout/fork this repository
49 | 3. Open a shell in the root directory and execute the following commands:
50 | ```
51 | bundle install;
52 | bundle update
53 | ```
54 |
55 | 4. Then you should be able to start a local Jekyll server to test your installation:
56 | ```
57 | bundle exec jekyll serve --config _config-localhost.yml
58 | ```
59 |
60 | 5. Open `http://localhost:4000` in your browser and enjoy your generated site.
61 |
62 |
63 | #### Prerequisites
64 |
65 | * Ruby installed (version 2.1 preferred, 2.4 didn't work for me)
66 | * Unix or MacOS, getting Jekyll to work on Windows lies beyond my abilities
67 | * some terminal proficiency
68 |
69 |
70 | ## Jekyll TTSCK Theme
71 |
72 | For documentation on this theme, see the [original documentation](https://ttskch.github.io/jekyll-ttskch-theme/).
73 |
74 | We implemented several enhancements over the original theme (e.g. responsive navigation, thx to Falk Hoppe)
75 |
--------------------------------------------------------------------------------
/_config-dev.yml:
--------------------------------------------------------------------------------
1 | #
2 | # URL settings
3 | #
4 | # these need to be adjusted depending on target platform,
5 | # local Jekyll need different settings than github-pages :-(
6 |
7 | # deployment with github-pages on custom domain
8 | #url: http://docs.arc42.org
9 | #imageurl: http://docs.arc42.org/images
10 |
11 |
12 | url: http://localhost
13 | imageurl: http://localhost:4000/images
14 | baseurl:
15 |
16 | # temporary deployment on arc42.github.io/faq
17 | # -----------------------------------------------------
18 | #url: http://arc42.github.io
19 | #baseurl: "/faq"
20 |
21 | #
22 | # basic settings
23 | #
24 | title: Patterns 42
25 | description: The incomplete guide to architecture patterns.
26 | avatar: /assets/img/arc42logosquare.png
27 | favicon: /assets/img/arc42-favicon.svg
28 | language: en
29 |
30 | str_search: Search
31 |
32 | #
33 | # want (disqus) comments?
34 | #
35 | disqus: false
36 |
37 | #
38 | # want subtle ads (on post-pages)
39 | #
40 | show-subtle-ads: true
41 |
42 |
43 | # Analytics
44 | analytics:
45 | google:
46 | tracking_id :
47 |
48 | #
49 | # Icons
50 | #
51 | icons:
52 | rss: false
53 | email: false
54 | github: arc42
55 | twitter: gernotstarke
56 | google_plus: 105917203908419102125
57 | stack_overflow: arc42
58 | slack: arc42
59 |
60 | #
61 | # Prettify url.
62 | #
63 | permalink: pretty
64 |
65 |
66 | #
67 | # Gems.
68 | #
69 | gems:
70 | - jekyll-paginate
71 | - jemoji
72 |
73 | #
74 | # Styles: see "_sass/base/_variables.scss"
75 | #
76 |
77 | #
78 | # !! Danger zone !!
79 | #
80 |
81 | include: ["_pages"]
82 |
83 | markdown: kramdown
84 | kramdown:
85 | input: GFM
86 | syntax_highlighter: rouge
87 |
88 |
89 | sass:
90 | sass_dir: _sass
91 | style: :compressed # or :expanded
92 |
93 | exclude: [Gemfile, Gemfile.lock, LICENSE, README.md, originals]
94 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | #
2 | # URL settings
3 | #
4 | # these need to be adjusted depending on target platform,
5 | # local Jekyll need different settings than github-pages :-(
6 |
7 |
8 | url: http://patterns.arc42.org
9 | imageurl: http://patterns.arc42.org/images
10 |
11 | baseurl:
12 |
13 | #
14 | # site generation, if we want local production builds
15 | #destination: _production
16 |
17 | #
18 | # basic settings
19 | #
20 | title: Patterns 42
21 | description: The incomplete guide to architecture patterns.
22 | avatar: /assets/img/arc42logosquare.png
23 | favicon: /assets/img/arc42-favicon.svg
24 | language: en
25 |
26 | str_search: Search
27 |
28 |
29 | #
30 | # want subtle ads (on post-pages)
31 | #
32 | show-subtle-ads: true
33 |
34 | # Analytics
35 | analytics:
36 | google:
37 | tracking_id : 'UA-93746670-2'
38 |
39 |
40 |
41 | #
42 | # want (disqus) comments?
43 | #
44 | disqus: false
45 |
46 | #
47 | # Icons
48 | #
49 | icons:
50 | rss: false
51 | email: false
52 | github: arc42
53 | twitter: gernotstarke
54 | google_plus: 105917203908419102125
55 | stack_overflow: arc42
56 | slack: arc42
57 |
58 | #
59 | # Prettify url.
60 | #
61 | permalink: pretty
62 |
63 |
64 | #
65 | # Gems.
66 | #
67 | gems:
68 | - jekyll-paginate
69 | - jemoji
70 |
71 | #
72 | # Styles: see "_sass/base/_variables.scss"
73 | #
74 |
75 | #
76 | # !! Danger zone !!
77 | #
78 |
79 | include: ["_pages"]
80 |
81 | markdown: kramdown
82 | kramdown:
83 | input: GFM
84 | syntax_highlighter: rouge
85 |
86 |
87 | sass:
88 | sass_dir: _sass
89 | style: :compressed # or :expanded
90 |
91 | exclude: [Gemfile, Gemfile.lock, LICENSE, README.md, originals, site]
92 |
--------------------------------------------------------------------------------
/_develop-site.sh:
--------------------------------------------------------------------------------
1 | #! /bin/bash
2 | #
3 | # helper, so you don't need to remember docker-compose syntax...
4 |
5 | # some colors to highlight certain output
6 | GREEN=`tput setaf 2`
7 | RED=`tput setaf 5`
8 | RESET=`tput sgr0`
9 |
10 | clear
11 |
12 | echo
13 | echo "Docker container to develop or build this website:"
14 | echo "=================================================="
15 | echo
16 | echo "Please select wether to ${GREEN}develop ${RESET} or ${RED} build ${RESET} the site:"
17 | echo
18 | echo "${GREEN}(d)evelop ${RESET} starts a jekyll server on port 0.0.0.0:4000,"
19 | echo "which performs incremental builds and listens for file changes."
20 | echo
21 | echo "${GREEN}(b)build ${RESET} build the required docker image."
22 | echo
23 | echo "${RED}(p)production ${RESET} produces the site with production configuration,"
24 | echo "into ./zz-site directory."
25 | echo "=================================================="
26 | echo
27 |
28 |
29 | read -p "Enter your selection (default: develop, d) : " choice
30 |
31 |
32 | if [[ -z $choice ]]; then
33 | choice='develop'
34 | fi
35 |
36 | case "$choice" in
37 | b|B|build) echo "build Docker image"
38 | docker-compose --file _docker-compose-dev.yml build --force-rm
39 | ;;
40 |
41 | d|D|dev|develop) echo "develop"
42 | docker-compose --file _docker-compose-dev.yml up
43 | ;;
44 |
45 | p|P|production) echo "create production site"
46 | docker-compose --file _docker-compose-prod.yml up
47 | docker-compose --file _docker-compose-prod.yml down
48 | ;;
49 |
50 | # catchall: abort
51 | *) echo "${RED} unknown option $choice ${RESET}, aborted."
52 | exit 1
53 | ;;
54 | esac
55 |
56 | echo "Thanx. Now running docker with ${choice} configuration."
57 |
--------------------------------------------------------------------------------
/_docker-compose-dev.yml:
--------------------------------------------------------------------------------
1 | # docker-compose definition for developing the site.
2 | #
3 | version: '2'
4 |
5 | services:
6 | jekyll:
7 | build: .
8 | image: arc42:patterns-site
9 | command: jekyll serve --trace --host 0.0.0.0 --watch --incremental
10 | environment:
11 | - JEKYLL_ENV=development
12 | # - PAGES_REPO_NWO=arc42/pattern.arc42.org-site
13 | ports:
14 | - 4000:4000
15 | volumes:
16 | - .:/srv/jekyll
17 | - $PWD/_config-dev.yml:/srv/jekyll/_config.yml
18 |
--------------------------------------------------------------------------------
/_docker-compose-prod.yml:
--------------------------------------------------------------------------------
1 | # docker-compose definition for generating a release-version.
2 | #
3 | version: '2'
4 |
5 | services:
6 | jekyll:
7 | build: .
8 | image: arc42:patterns-site
9 | command: jekyll build --destination zz-site --no-watch
10 | volumes:
11 | - .:/srv/jekyll
12 | - $PWD/_config.yml:/srv/jekyll/_config.yml
13 |
14 |
15 |
--------------------------------------------------------------------------------
/_includes/analytics.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
22 |
23 |
24 |
40 |
41 |
50 |
--------------------------------------------------------------------------------
/_includes/article-footer.html:
--------------------------------------------------------------------------------
1 |
2 | {% if site.share_buttons and include.share != false %}
3 | {% endif %}
4 |
5 |
--------------------------------------------------------------------------------
/_includes/article-header.html:
--------------------------------------------------------------------------------
1 | {% assign page = include.page %}
2 |
3 |
4 |
5 |
6 | {% if include.link %}
7 | {{ page.title }}
8 | {% else %}
9 | {{ page.title }}
10 | {% endif %}
11 |
12 |
13 |
24 |
25 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/_includes/contact-include.md:
--------------------------------------------------------------------------------
1 |
2 | ## You still have questions?
3 |
4 | Please let us know - we're listening to you:
5 |
6 |
7 | * Email (our adress is spam-protected)
8 | * on our [ github issue tracker](https://github.com/arc42/arc42-template/issues) at https://github.com/arc42/patterns.arc42.org-site/issues.
9 | * on Twitter: [@gernotstarke](https://twitter.com/gernotstarke)
10 |
11 |
12 | This page was last built on {{ site.time | date: '%c' }}
13 |
--------------------------------------------------------------------------------
/_includes/icons.html:
--------------------------------------------------------------------------------
1 | {% assign icons = include.icons %}
2 |
3 |
4 | {% if icons.email %}
5 |
6 |
7 |
8 |
9 |
10 | {% endif %}
11 |
12 | {% if icons.github %}
13 |
14 |
15 |
16 |
17 |
18 | {% endif %}
19 |
20 |
21 | {% if icons.twitter %}
22 |
23 |
24 |
25 |
26 |
27 | {% endif %}
28 |
29 |
30 |
31 | {% if icons.stack_overflow %}
32 |
33 |
34 |
35 |
36 |
37 | {% endif %}
38 |
39 |
40 | {% if icons.google_plus %}
41 |
42 |
43 |
44 |
45 |
46 | {% endif %}
47 |
48 | {% if icons.slack %}
49 |
50 |
51 |
52 |
53 |
54 | {% endif %}
55 |
--------------------------------------------------------------------------------
/_includes/page-url-resolver.html:
--------------------------------------------------------------------------------
1 | {% assign page = include.page %}
2 |
3 | {% if page.canonical %}
4 | {% assign url = page.canonical | prepend: site.baseurl | prepend: site.url %}
5 | {% else %}
6 | {% assign url = page.url | replace: 'index.html', '' | prepend: site.baseurl | prepend: site.url %}
7 | {% endif %}
8 |
--------------------------------------------------------------------------------
/_includes/share-buttons.html:
--------------------------------------------------------------------------------
1 | {% include page-url-resolver.html page=include.page %}
2 | {% assign title = include.page.title | append: ' | ' | append: site.title %}
3 |
4 |
5 | {% if site.share_buttons.twitter %}
6 |
7 |
8 |
9 |
10 | {% endif %}
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/_layouts/arc42-doc-section.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
12 |
13 | {% if site.show-subtle-ads %}
14 |
15 | {% include subtle-ads/subtle-ads.html %}
16 |
17 | {% endif %}
18 |
--------------------------------------------------------------------------------
/_layouts/default.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {% capture title %}{% if page.title %}{{ page.title }} | {% endif %}{{ site.title }}{% endcapture %}
5 |
6 | {% include page-url-resolver.html page=page %}
7 |
8 | {% if page.excerpt %}
9 | {% assign description = page.excerpt | strip_html | strip_newlines | truncate: 160 %}
10 | {% else %}
11 | {% assign description = site.description %}
12 | {% endif %}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | {{ title }}
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
37 |
38 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
61 |
62 |
63 |
64 |
65 |
66 |
69 |
70 |
71 | {% assign pages = (site.pages | sort: 'order') %}
72 | {% for page in pages %}
73 | {% if page.title and page.hide != true %}
74 | {{ page.title }}
75 | {% endif %}
76 | {% endfor %}
77 |
78 |
79 | {% include icons.html icons=site.icons %}
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | {{ content }}
88 |
89 |
90 |
91 |
92 |
93 |
102 |
103 |
104 |
105 |
106 |
107 | {% if page.id %}
108 |
109 | {% endif %}
110 |
111 | {% if page.permalink == '/search/' %}
112 |
113 | {% endif %}
114 |
115 | {% include analytics.html %}
116 |
117 |
118 |
119 |
--------------------------------------------------------------------------------
/_layouts/index_default.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/_layouts/page.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 |
7 | {% include article-header.html page=page link=false share=page.share %}
8 |
11 | {% include article-footer.html page=page share=page.share %}
12 |
13 |
14 |
15 | {% if site.show-subtle-ads %}
16 |
17 | {% include subtle-ads/subtle-ads.html %}
18 |
19 | {% endif %}
20 |
--------------------------------------------------------------------------------
/_layouts/post.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 |
7 | {% include article-header.html page=page link=false share=page.share %}
8 |
11 | {% include article-footer.html page=page share=page.share %}
12 |
13 |
14 |
15 | {% if site.show-subtle-ads %}
16 |
17 | {% include subtle-ads/subtle-ads.html %}
18 |
19 | {% endif %}
20 |
--------------------------------------------------------------------------------
/_pages/categories.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Pattern Categories
4 | permalink: /categories/
5 | order: 5
6 | ---
7 |
8 |
9 | When reading different books or articles on software patterns, you will
10 | notice that there are different and sometimes contradictory proposals
11 | on how to _organize_ these patterns. Pragmatically I added patterns to
12 | all potential categories
13 |
14 | I reused some category proposals from [books](/references) and finally came up
15 | with the following results:
16 |
17 | 1. [**Overall System Structure**](/overall/): Patterns to structure
18 | systems or large components. Sometimes named _From Mud to Structure_, for example: Layers, Tiers, Master/Slave, Client/Server, Domain-Model, Transaction-Script, Virtual Machine.
19 |
20 | 1. [**Data flow**](/dataflow/):
21 | Pipes-and-Filter and its variants, Blackboard
22 |
23 | 1. [**Interactive Systems**](/interactive/): Model-View-Controller, Model-View-ViewModel and their variants
24 |
25 | 1. [**Integration Patterns**](/integration/):
26 | Publish-Subscribe, Messaging, Remote-Procedure-Call, Hub-and-Spoke etc.
27 |
28 | 1. [**Adaptive Systems**](/adaptive/):
29 | PlugIn, Broker, MicroServices
30 |
31 | 1. [**Domain Patterns**](/domain/):
32 | Open-Host-Service, Published-Language, Anticorruption-Layer, Separate-Ways
33 |
34 | 1. [**Stability and Robustness Patterns**](/stability/):
35 | Bulkhead, Timeout, Circuit-Breaker, Heartbeat, Handshake etc.
36 |
37 | 1. [**Resource Management Patterns**](/resource_management/): Patterns
38 | for resource acquisition (lookup, lazy/eager or partial acquisition), handling resource lifecycle (caching, pooling, coordination) and others.
39 |
40 | 1. [**Workflow Patterns**](/workflow/): TODO
41 |
42 | 1. [**Security Patterns**](/security): TODO
43 |
44 | 1. [**Microservice Patterns**](/microservices): TODO
45 |
46 | 1. [**Design Patterns**](/design/): Fine-grained patterns, often associated
47 | with class or object _structure_, _behavior_ or _creation_. I concentrate
48 | on those which are independend of the underlying programming paradigm, e.g.
49 | Proxy, Adapter, Facade, Registry, Command, Observer
50 |
--------------------------------------------------------------------------------
/_pages/contact.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Contact
4 | permalink: /contact/
5 | order: 30
6 | ---
7 |
8 | ## You still have questions?
9 |
10 | Please let us know - we're listening to you:
11 |
12 |
13 | * Email (our adress is spam-protected)
14 | * on our [ github issue tracker](https://github.com/arc42/arc42-template/issues) at https://github.com/arc42/patterns.arc42.org-site/issues.
15 | * on various Twitter accounts:
16 | * [@arc42Tipps](https://twitter.com/arc42Tipps)
17 | * [@gernotstarke](https://twitter.com/gernotstarke)
18 | * on [ Stackoverflow](http://stackoverflow.com/questions/tagged/arc42)
19 |
20 |
21 | This page was last built on {{ site.time | date: '%c' }}
22 |
--------------------------------------------------------------------------------
/_pages/home.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | title: Home
4 | order: 0
5 | permalink: /home/
6 | ---
7 |
8 | {% assign nr_overall_patterns = (site.posts | where: "category", "overall") | size %}
9 | {% assign nr_dataflow_patterns = (site.posts | where: "category", "dataflow") | size %}
10 | {% assign nr_interactive_patterns = (site.posts | where: "category", "interactive") | size %}
11 | {% assign nr_integration_patterns = (site.posts | where: "category", "integration") | size %}
12 | {% assign nr_adaptive_patterns = (site.posts | where: "category", "adaptive") | size %}
13 | {% assign nr_domain_patterns = (site.posts | where: "category", "domain") | size %}
14 | {% assign nr_stability_patterns = (site.posts | where: "category", "stability") | size %}
15 | {% assign nr_resource_patterns = (site.posts | where: "category", "resource") | size %}
16 | {% assign nr_workflow_patterns = (site.posts | where: "category", "workflow") | size %}
17 | {% assign nr_resource_patterns = (site.posts | where: "category", "resource") | size %}
18 | {% assign nr_microservice_patterns = (site.posts | where: "category", "microservice") | size %}
19 | {% assign nr_design_patterns = (site.posts | where: "category", "design") | size %}
20 |
21 | ## Overview
22 |
23 | Check out architecture patterns, organized by informal and intersecting **[categories](/categories)**:
24 | (some patterns might belong to two or more categories, use the search button if in doubt...).
25 |
26 | All of these patterns have been extensively documented in (paper-based and online) **[references](/references/)**.
27 |
28 |
29 |
30 | 1. [**Overall System Structure**](/overall/): {{ nr_overall_patterns }} patterns, e.g. Layers, Tiers, Master/Slave, Client/Server, Onion-Style, Hexagonal-Architecture, Domain-Model, Transaction-Script, Virtual Machine, etc.
31 | 1. [**Data flow**](/dataflow/): {{ nr_dataflow_patterns }} patterns, e.g. Pipes-and-Filter and its variants, Blackboard
32 | 1. [**Interactive Systems**](/interactive/): {{ nr_interactive_patterns }} patterns, e.g. Model-View-Controller, Model-View-ViewModel and their variants
33 | 1. [**Integration Patterns**](/integration/): {{ nr_integration_patterns }} patterns, e.g. Publish-Subscribe, Messaging, Remote-Procedure-Call, Hub-and-Spoke etc.
34 | 1. [**Adaptive Systems**](/adaptive/): {{ nr_adaptive_patterns }} patterns, e.g. PlugIn, Broker, MicroServices
35 | 1. [**Domain Patterns**](/domain/): {{ nr_domain_patterns }} patterns, e.g. Open-Host-Service, Published-Language, Anticorruption-Layer, Separate-Ways
36 | 1. [**Stability and Robustness Patterns**](/stability/): {{ nr_stability_patterns }} patterns, e.g. Bulkhead, Timeout, Circuit-Breaker, Heartbeat, Handshake etc.
37 | 1. [**Resource Management Patterns**](/resource-management/): {{ nr_resource_patterns }} patterns, TODO
38 | 1. [**Workflow Patterns**](/workflow/): {{ nr_workflow_patterns }} patterns, TODO
39 | 1. [**Security Patterns**](/security/): {{ nr_security_patterns }} patterns, TODO
40 | 1. [**Microservice Patterns**](/microservice/): {{ nr_microservice_patterns }} patterns, TODO
41 | 1. [**Design Patterns**](/design/): {{ nr_design_patterns }} patterns, e.g. Proxy, Adapter, Facade, Registry, Command, Factory, Observer
42 |
43 | ## Keywords
44 | These patterns are tagged by [**{{ site.tags.size }} keywords**](/keywords) that will help you navigate:
45 |
46 | {% capture site_tags %}{% for tag in site.tags %}{{ tag | first }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
47 | {% assign tag_words = site_tags | split:',' | sort %}
48 |
60 |
61 | One of this keywords ([cpsa-f ](/keywords/#cpsa-f))
62 | stands out - it denotes those patterns that are mentioned in
63 | the [iSAQB](http://isaqb.org) software architecture foundation curriculum. Their knowledge might
64 | be required in [CPSA-F](http://www.isaqb.org/certifications/foundation-level/) examinations.
65 |
66 | ## Style? Pattern? Category?
67 |
68 | The definition of styles or patterns heavily varies, depending on the original authors.
69 |
70 | Several patterns (e.g. MicroServices) fit several categories.
71 |
72 |
73 | ## We're offering architecture training!
74 |
75 | The _dynamic duo_, always two trainers in parallel, practically applicable
76 | knowledge from Peter Hruschka and Gernot Starke. See [arc42.de](http://www.arc42.de/training.html) for details, and schedule.
77 |
78 | We've successfully trained more than 1000 developers in software architecture,
79 | many of them passed the [iSAQB CPSA-F](http://isaqb.org) certification.
80 | (sorry - public training currently German-only, English for inhouse trainings.)
81 |
--------------------------------------------------------------------------------
/_pages/imprint-privacy.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Imprint & Privacy
4 | permalink: /imprint/
5 | order: 90
6 | share: false
7 | hide: true
8 | ---
9 |
10 | The following text has to be included in sites provided from Germany by German citicens,
11 | due to our sometimes strange, inconsistent and user-unfriendly data privacy laws.
12 |
13 | ## Imprint
14 |
15 | #### Anbieter
16 |
17 | Dr. Gernot Starke, Willi-Lauf Allee 43, D-50858 Köln
18 |
19 | #### Kontakt
20 |
21 | Telefon: +49-177-728 2570
22 | e-Mail: gs - at - gernotstarke - dot - de
23 | Website: [gernotstarke.de](http://gernotstarke.de)
24 |
25 | #### Verantwortlich nach § 6 Abs.2 MDStV
26 |
27 | Dr. Gernot Starke, mit Unterstützung von Dr. Peter Hruschka (Aachen).
28 |
29 |
30 |
31 | ## Privacy Statement (Datenschutzerklärung)
32 |
33 | #### Geltungsbereich
34 | Diese Datenschutzerklärung klärt Nutzer über die Art, den Umfang und Zwecke der Erhebung und Verwendung personenbezogener Daten durch den verantwortlichen Anbieter Dr. Gernot Starke, Willi-Lauf Allee 43, D-50858 Köln, Deutschland, Email (gegen Spam gesichert) , Tel.: +49 177 7282570 auf dieser Website (im folgenden “Angebot”) auf.
35 |
36 | Die rechtlichen Grundlagen des Datenschutzes finden sich im Bundesdatenschutzgesetz (BDSG) und dem Telemediengesetz (TMG).
37 |
38 |
39 | #### Zugriffsdaten/ Server-Logfiles
40 | Der Anbieter (beziehungsweise sein Webspace-Provider) erhebt Daten über jeden Zugriff auf das Angebot (so genannte Serverlogfiles). Zu den Zugriffsdaten gehören:
41 |
42 | Name der abgerufenen Webseite, Datei, Datum und Uhrzeit des Abrufs, übertragene Datenmenge, Meldung über erfolgreichen Abruf, Browsertyp nebst Version, das Betriebssystem des Nutzers, Referrer URL (die zuvor besuchte Seite), IP-Adresse und der anfragende Provider.
43 |
44 | Der Anbieter verwendet die Protokolldaten nur für statistische Auswertungen zum Zweck des Betriebs, der Sicherheit und der Optimierung des Angebotes. Der Anbieterbehält sich jedoch vor, die Protokolldaten nachträglich zu überprüfen, wenn aufgrund konkreter Anhaltspunkte der berechtigte Verdacht einer rechtswidrigen Nutzung besteht.
45 |
46 | #### Kontaktaufnahme
47 | Bei der Kontaktaufnahme mit dem Anbieter (zum Beispiel per Kontaktformular oder E-Mail) werden die Angaben des Nutzers zwecks Bearbeitung der Anfrage sowie für den Fall, dass Anschlussfragen entstehen, gespeichert.
48 |
49 | #### Kommentare und Beiträge
50 | Wenn Nutzer Kommentare im Blog oder sonstige Beiträge hinterlassen, werden ihre IP-Adressen gespeichert. Das erfolgt zur Sicherheit des Anbieters, falls jemand in Kommentaren und Beiträgen widerrechtliche Inhalte schreibt (Beleidigungen, verbotene politische Propaganda, etc.). In diesem Fall kann der Anbieter selbst für den Kommentar oder Beitrag belangt werden und ist daher an der Identität des Verfassers interessiert.
51 |
52 | #### Google Analytics
53 | Dieses Angebot benutzt Google Analytics, einen Webanalysedienst der Google Inc. („Google“). Google Analytics verwendet sog. „Cookies“, Textdateien, die auf Computer der Nutzer gespeichert werden und die eine Analyse der Benutzung der Website durch sie ermöglichen. Die durch den Cookie erzeugten Informationen über Benutzung dieser Website durch die Nutzer werden in der Regel an einen Server von Google in den USA übertragen und dort gespeichert.
54 |
55 | Im Falle der Aktivierung der IP-Anonymisierung auf dieser Webseite, wird die IP-Adresse der Nutzer von Google jedoch innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum zuvor gekürzt. Nur in Ausnahmefällen wird die volle IP-Adresse an einen Server von Google in den USA übertragen und dort gekürzt. Die IP-Anonymisierung ist auf dieser Website aktiv. Im Auftrag des Betreibers dieser Website wird Google diese Informationen benutzen, um die Nutzung der Website durch die Nutzer auszuwerten, um Reports über die Websiteaktivitäten zusammenzustellen und um weitere mit der Websitenutzung und der Internetnutzung verbundene Dienstleistungen gegenüber dem Websitebetreiber zu erbringen.
56 |
57 | Die im Rahmen von Google Analytics von Ihrem Browser übermittelte IP-Adresse wird nicht mit anderen Daten von Google zusammengeführt. Die Nutzer können die Speicherung der Cookies durch eine entsprechende Einstellung Ihrer Browser-Software verhindern; Dieses Angebot weist die Nutzer jedoch darauf hin, dass Sie in diesem Fall gegebenenfalls nicht sämtliche Funktionen dieser Website vollumfänglich werden nutzen können. Die Nutzer können darüber hinaus die Erfassung der durch das Cookie erzeugten und auf ihre Nutzung der Website bezogenen Daten (inkl. Ihrer IP-Adresse) an Google sowie die Verarbeitung dieser Daten durch Google verhindern, indem sie das unter dem folgenden Link verfügbare Browser-Plugin herunterladen und installieren:
58 | http://tools.google.com/dlpage/gaoptout?hl=de .
59 |
60 | Weitere Informationen zur Datennutzung zu Werbezwecken durch Google, Einstellungs- und Widerspruchsmöglichkeiten erfahren Sie auf den Webseiten von Google:
61 |
62 | * https://www.google.com/intl/de/policies/privacy/partners/ („Datennutzung durch Google bei Ihrer Nutzung von Websites oder Apps unserer Partner“),
63 | * http://www.google.com/policies/technologies/ads („Datennutzung zu Werbezwecken“),
64 | * http://www.google.de/settings/ads („Informationen verwalten, die Google verwendet, um Ihnen Werbung einzublenden“) und
65 | * http://www.google.com/ads/preferences/
66 | („Bestimmen Sie, welche Werbung Google Ihnen zeigt“).
67 |
68 | Alternativ zum Browser-Add-On oder innerhalb von Browsern auf mobilen Geräten, klicken Sie bitte diesen Link , um die Erfassung durch Google Analytics innerhalb dieser Website zukünftig zu verhindern. Dabei wird ein Opt-Out-Cookie auf Ihrem Gerät abgelegt. Löschen Sie Ihre Cookies, müssen Sie diesen Link erneut klicken.
69 |
70 | #### Widerruf, Änderungen, Berichtigungen und Aktualisierungen
71 | Der Nutzer hat das Recht, auf Antrag unentgeltlich Auskunft zu erhalten über die personenbezogenen Daten, die über ihn gespeichert wurden. Zusätzlich hat der Nutzer das Recht auf Berichtigung unrichtiger Daten, Sperrung und Löschung seiner personenbezogenen Daten, soweit dem keine gesetzliche Aufbewahrungspflicht entgegensteht.
72 |
73 | #### Quelle
74 | Danke an Hr Rechtsanwalt Thomas Schwenke:
75 | Datenschutz-Muster von Rechtsanwalt Thomas Schwenke - I LAW it
76 |
--------------------------------------------------------------------------------
/_pages/keywords.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: All patterns (by category)
4 | permalink: /keywords/
5 | order: 70
6 | share: false
7 | ---
8 |
9 |
10 | {% capture site_tags %}{% for tag in site.tags %}{{ tag | first }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}
11 |
12 | {% assign tag_words = site_tags | split:',' | sort %}
13 |
14 |
15 |
16 |
40 |
--------------------------------------------------------------------------------
/_pages/references.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Pattern Literature
4 | permalink: /references/
5 | share: false
6 | order: 80
7 | ---
8 |
9 | #### Buschmann, Frank et. al: POSA-Serie: Pattern-Oriented Software Architecture.
10 |
11 | Prentice-Hall Publishing.
12 |
13 | * Vol. 1 (z.B. Layers, Pipes-and-Filter, Blackboard) 1996
14 | * Vol. 2 (Schmid, Douglas) Patterns for Concurrent and Networked Objects
15 | * Vol. 3 (Kircher, Michael) Patterns for Resource Management
16 | * Vol. 4: Patterns und Pattern-Languages: Die Zusammenfassung!
17 |
18 | #### Cockburn, Alistair: Hexagonal Architecture.
19 |
20 | Online: http://alistair.cockburn.us/Hexagonal+architecture
21 |
22 | #### Evans, Eric: Domain Driven Design.
23 |
24 | Addison-Wesley, 2004. [Partially available online](http://domaindrivendesign.org).
25 |
26 |
27 | #### Fowler, Martin: Patterns of Enterprise Application Architecture.
28 | Addision-Wesley, 2002.
29 |
30 | #### Gamma, Erich & Co: Design Patterns
31 | The famous original book on design patterns, many of these primarily relevant of
32 | object oriented systems - but a few are language-independend and still useful.
33 |
34 | #### Hohpe, G., B. Woolf: Enterprise Integration Patterns:
35 |
36 | Designing, Building, and Deploying Messaging Solutions. Addison-Wesley, 2003.
37 |
38 | #### Microsoft Application Architecture Guide
39 |
40 | Online: [https://msdn.microsoft.com/en-us/library/ee658117.aspx](https://msdn.microsoft.com/en-us/library/ee658117.aspx)
41 |
42 | #### Nygard, Michael: Release It
43 |
44 | Design and Deploy Production-Ready Software
45 |
46 | From the publisher:
47 |
48 | >In Release It!, Michael T. Nygard shows you how to design and architect your application for the harsh realities it will face. You’ll learn how to design your application for maximum uptime, performance, and return on investment.
49 |
50 | https://pragprog.com/book/mnee/release-it
51 |
52 | #### Scott Millett, Nick Tune: Patterns, Principles, and Practices of Domain-Driven Design.
53 | Wrox-Press, 2016.
54 |
55 | #### Vernon, Vaughn: Domain-Driven Design Distilled.
56 | Addison-Wesley 2016.
57 |
58 | #### Workflow Patterns
59 |
60 | van der Aalst, ter-Hofstede: [Workflow Patterns](http://www.workflowpatterns.com/), online: http://www.workflowpatterns.com/
61 |
--------------------------------------------------------------------------------
/_pages/search.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Search Results
4 | permalink: /search/
5 | hide: true
6 | share: false
7 | ---
8 |
9 |
12 |
13 |
14 |
15 |
16 | {% assign sorted_posts = (site.posts | sort_by: 'title') | reverse %}
17 | {% for post in site.posts %}
18 |
19 |
20 |
21 | {% include article-header.html page=post link=true share=false %}
22 |
23 |
24 |
25 |
26 | {% endfor %}
27 |
28 |
--------------------------------------------------------------------------------
/_pages/sect-1-overall.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 1 - Overall System Structure
4 | permalink: /overall/
5 | order: 11
6 | ---
7 |
8 |
9 |
10 |
11 |
12 | {% assign selected_posts = (site.posts | where: "category", "overall") | reverse %}
13 | {% for post in selected_posts %}
14 |
15 |
16 | {% include article-header.html page=post link=true share=false %}
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 |
--------------------------------------------------------------------------------
/_pages/sect-10-security.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 10 - Security Patterns
4 | permalink: /security/
5 | order: 23
6 | ---
7 |
8 | Here you (some day...) find security patterns.
9 |
10 |
11 |
12 |
13 |
14 | {% assign selected_posts = (site.posts | where: "category", "security") | reverse %}
15 | {% for post in selected_posts %}
16 |
17 |
18 | {% include article-header.html page=post link=true share=false %}
19 |
20 |
21 |
22 | {% endfor %}
23 |
24 |
--------------------------------------------------------------------------------
/_pages/sect-11-microservices.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 11 - Microservice Patterns
4 | permalink: /microservice/
5 | order: 25
6 | ---
7 |
8 | Here you (some day...) find microservice patterns.
9 |
10 |
11 |
12 |
13 |
14 | {% assign selected_posts = (site.posts | where: "category", "microservice") | reverse %}
15 | {% for post in selected_posts %}
16 |
17 |
18 | {% include article-header.html page=post link=true share=false %}
19 |
20 |
21 |
22 | {% endfor %}
23 |
24 |
--------------------------------------------------------------------------------
/_pages/sect-2-dataflow.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 2 - Dataflow Architectures
4 | permalink: /dataflow/
5 | order: 12
6 | ---
7 | >Dataflow architectures view an entire software system
8 | as a series of transformations on successive sets of data.
9 | >Each of these sets is independend of the others.
10 | >The software is decomposed in data processing elements where data directs the order of computation and processing.
11 | > -- Kai Quian et. al,
12 |
13 | In such architectures, data can either flow in linear fashion,
14 | or in cycles or any other topology of processing elements.
15 | Regardless of the structure, data always moves from one element
16 | to another. There is usually no other interaction or dependency
17 | between the processing elements than these data connectors.
18 |
19 | These connections can be implemented in various ways (I/O streams,
20 | sockets, files, queues or other means).
21 |
22 | See also the [integration patterns](/integration).
23 |
24 |
25 |
26 |
27 |
28 |
29 | {% assign selected_posts = (site.posts | where: "category", "dataflow") | reverse %}
30 | {% for post in selected_posts %}
31 |
32 |
33 | {% include article-header.html page=post link=true share=false %}
34 |
35 |
36 |
37 | {% endfor %}
38 |
39 |
--------------------------------------------------------------------------------
/_pages/sect-20-design.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 12 - Design Patterns
4 | permalink: /design/
5 | order: 27
6 | ---
7 |
8 | Here you find generally applicable _design patterns_, which should be independend
9 | of programming language or -technology.
10 |
11 |
12 |
13 |
14 |
15 | {% assign selected_posts = (site.posts | where: "category", "design") | reverse %}
16 | {% for post in selected_posts %}
17 |
18 |
19 | {% include article-header.html page=post link=true share=false %}
20 |
21 |
22 |
23 | {% endfor %}
24 |
25 |
--------------------------------------------------------------------------------
/_pages/sect-3-interactive.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 3 - Interactive Systems
4 | permalink: /interactive/
5 | order: 14
6 | ---
7 |
8 |
9 |
10 |
11 |
12 |
13 | {% assign selected_posts = (site.posts | where: "category", "interactive") | reverse %}
14 | {% for post in selected_posts %}
15 |
16 |
17 | {% include article-header.html page=post link=true share=false %}
18 |
19 |
20 |
21 | {% endfor %}
22 |
23 |
--------------------------------------------------------------------------------
/_pages/sect-4-integration.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 4 - Integration Patterns
4 | permalink: /integration/
5 | order: 15
6 | ---
7 |
8 |
9 |
10 |
11 |
12 | {% assign selected_posts = (site.posts | where: "category", "integration") | reverse %}
13 | {% for post in selected_posts %}
14 |
15 |
16 | {% include article-header.html page=post link=true share=false %}
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 |
--------------------------------------------------------------------------------
/_pages/sect-5-adaptive.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 5 - Adaptive Systems
4 | permalink: /adaptive/
5 | order: 16
6 | ---
7 |
8 |
9 |
10 |
11 |
12 | {% assign selected_posts = (site.posts | where: "category", "adaptive") | reverse %}
13 | {% for post in selected_posts %}
14 |
15 |
16 | {% include article-header.html page=post link=true share=false %}
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 |
--------------------------------------------------------------------------------
/_pages/sect-6-domain.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 6 - Domain Patterns
4 | permalink: /domain/
5 | order: 17
6 | ---
7 |
8 |
9 |
10 |
11 |
12 | {% assign selected_posts = (site.posts | where: "category", "domain") | reverse %}
13 | {% for post in selected_posts %}
14 |
15 |
16 | {% include article-header.html page=post link=true share=false %}
17 |
18 |
19 |
20 | {% endfor %}
21 |
22 |
--------------------------------------------------------------------------------
/_pages/sect-7-stability.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 7 - Stability Patterns
4 | permalink: /stability/
5 | order: 18
6 | ---
7 |
8 | Stability, availability
9 |
10 |
11 |
12 |
13 |
14 | {% assign selected_posts = (site.posts | where: "category", "stability") | reverse %}
15 | {% for post in selected_posts %}
16 |
17 |
18 | {% include article-header.html page=post link=true share=false %}
19 |
20 |
21 |
22 | {% endfor %}
23 |
24 |
--------------------------------------------------------------------------------
/_pages/sect-8-resource-management.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 8 - Resource Management
4 | permalink: /resource-management/
5 | order: 19
6 | ---
7 |
8 | Here you (some nice day...) find patterns for resource management.
9 |
10 |
11 |
12 |
13 |
14 | {% assign selected_posts = (site.posts | where: "category", "resource") | reverse %}
15 | {% for post in selected_posts %}
16 |
17 |
18 | {% include article-header.html page=post link=true share=false %}
19 |
20 |
21 |
22 | {% endfor %}
23 |
24 |
--------------------------------------------------------------------------------
/_pages/sect-9-workflow.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: 9 - Workflow Patterns
4 | permalink: /workflow/
5 | order: 21
6 | ---
7 |
8 | Here you (some day...) find workflow patterns.
9 |
10 |
11 |
12 |
13 |
14 | {% assign selected_posts = (site.posts | where: "category", "workflow") | reverse %}
15 | {% for post in selected_posts %}
16 |
17 |
18 | {% include article-header.html page=post link=true share=false %}
19 |
20 |
21 |
22 | {% endfor %}
23 |
24 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-01-layer.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Layer
4 | tags: hierarchical-structure overall architectural-pattern cpsa-f _TODO
5 | category: overall
6 | permalink: /patterns/layer/
7 | ---
8 |
9 | ## Layer
10 |
11 | ### Context
12 |
13 | A large system that requires decomposition.
14 |
15 | ### Problem
16 |
17 | Designing a complex systems with high- and low-level issues.
18 |
19 | ### Known Uses
20 |
21 | * Virtual Machines
22 |
23 | * APIs
24 |
25 | * Information Systems
26 |
27 | ### Forces
28 |
29 | * Source code changes should not ripple through the system
30 |
31 | * Interfaces should be stable
32 |
33 | * Parts of the system should be exchangeable
34 |
35 | * Reusability of low-level issues for other systems
36 |
37 | * Better understanding and maintainability
38 |
39 | * Complex components needs further decomposition
40 |
41 | * Crossing components boundaries may impede performance, especially if substantial amount of data must be transferred over several boundaries
42 |
43 | * The system is build by a team of programmers, and work has to be subdivided along clear boundaries
44 |
45 | ### Consequences
46 |
47 | * Reuse of layers
48 |
49 | * Support for standardization
50 |
51 | * Dependencies are kept local
52 |
53 | * Exchangeability
54 |
55 | ### Liabilites
56 |
57 | * Cascades of changing behavior
58 |
59 | * Lower efficiency
60 |
61 | * Unnecessary work
62 |
63 | * Difficulty of establishing the correct granularity of layers
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-02-client-server.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "Client-Server"
4 | tags: hierarchical-structure overall architectural-pattern _TODO
5 | category: overall
6 | permalink: /patterns/client-server/
7 | ---
8 |
9 | ## Client-Server
10 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-03-master-slave.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "Master-Slave"
4 | tags: hierarchical-structure overall architectural-pattern _TODO
5 | category: overall
6 | permalink: /patterns/master-slave/
7 | ---
8 |
9 | 
10 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-04-onion-style.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Onion-style architecture
4 | tags: hierarchical-structure overall architectural-pattern _TODO
5 | category: overall
6 | permalink: /patterns/onion/
7 | ---
8 |
9 | ## Onion-Style
10 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-05-hexagonal-architecture.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "Hexagonal Architecture"
4 | tags: hierarchical-structure overall architectural-pattern ports-adapter
5 | category: overall
6 | permalink: /patterns/hexagonal/
7 | ---
8 | Synonym: Ports-and-Adapter
9 |
10 | ## Intent
11 |
12 | > Allow an application to equally be driven by users, programs, automated test or batch scripts, and to be developed and tested in isolation from its eventual run-time devices and databases.
13 | -- [Alistair Cockburn](http://alistair.cockburn.us/Hexagonal+architecture)
14 |
15 |
16 | ## Solution
17 |
18 | Again, I quote the original author, Alistair:
19 |
20 | > As events arrive from the outside world at a port, a technology-specific adapter converts it into a usable procedure call or message and passes it to the application. The application is blissfully ignorant of the nature of the input device. When the application has something to send out, it sends it out through a port to an adapter, which creates the appropriate signals needed by the receiving technology (human or automated). The application has a semantically sound interaction with the adapters on all sides of it, without actually knowing the nature of the things on the other side of the adapters.
21 | -- [Alistair Cockburn](http://alistair.cockburn.us/Hexagonal+architecture)
22 |
23 | 
24 |
25 |
26 | ## References
27 |
28 | * The original article by [Alistair Cockburn](http://alistair.cockburn.us/Hexagonal+architecture)
29 | * Jan Stenberg on infoQ: [Exploring the Hexagonal Architecture](https://www.infoq.com/news/2014/10/exploring-hexagonal-architecture)
30 | * Discussion [on the C2 Wiki](http://wiki.c2.com/?HexagonalArchitecture)
31 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-06-transaction-script.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: "Transaction Script"
4 | tags: overall architectural-pattern _TODO
5 | category: overall
6 | permalink: /patterns/transaction-script/
7 | ---
8 |
9 | ## Transaction Script
10 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-07-domain-model.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Domain Model
4 | tags: overall architectural-pattern domain-model ddd _TODO
5 | category: overall
6 | permalink: /patterns/domain-model/
7 | ---
8 |
9 | ## Master-Slave
10 |
--------------------------------------------------------------------------------
/_posts/01-overall/2017-03-08-virtual-machine.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Virtual Machine
4 | tags: hierarchical-structure overall architectural-pattern _TODO
5 | category: overall
6 | permalink: /patterns/virtual-machine/
7 | ---
8 |
9 | ## Virtual Machine
10 |
--------------------------------------------------------------------------------
/_posts/02-dataflow/2017-02-01-batch-sequential.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Batch-Sequential
4 | tags: dataflow sequential _TODO
5 | category: dataflow
6 | permalink: /patterns/batch-sequential/
7 | ---
8 |
9 | 
10 |
--------------------------------------------------------------------------------
/_posts/02-dataflow/2017-02-02-pipes-filter.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Pipes and Filter
4 | tags: dataflow sequential cpsa-f _TODO
5 | category: dataflow
6 | permalink: /patterns/pipes-filter/
7 | ---
8 |
9 | ## Pipes and Filter
10 |
11 | ### Context
12 |
13 | Processing data streams.
14 |
15 | ### Problem
16 |
17 | Building a system that pcoesses or transform data.
18 |
19 | ### Solution
20 |
21 | 
22 |
23 | ### Forces
24 |
25 | * Exchanging of processing steps or recombination of steps should be possible
26 |
27 | * Reusability of processing steps
28 |
29 | * No sharing of information between non-adjacent processing steps
30 |
31 | * Different sources of input data exists
32 |
33 | * Final results should be storable in various ways
34 |
35 | * Intermediade results for further processing should be handled by the system
36 |
37 | * Support of paralell running
38 |
39 | ### Consequences
40 |
41 | * No intermediate files necessary, but possible
42 |
43 | * Flexibility by filter exchange
44 |
45 | * Flexibility by recombination
46 |
47 | * Reuse of filter components
48 |
49 | * Rapid prototyping of pipelines
50 |
51 | * Efficiency by parallel processing
52 |
53 | ### Liabilites
54 |
55 | * Sharing state information is expensive or inflexible
56 |
57 | * Efficiency gain by parallel processing is often a illusion
58 |
59 | * Data transformation overhead
60 |
61 | * Error handling
62 |
--------------------------------------------------------------------------------
/_posts/02-dataflow/2017-02-03-data-centric.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Data Centric
4 | tags: dataflow cpsa-f _TODO
5 | category: dataflow
6 | permalink: /patterns/data-centric/
7 | ---
8 |
9 | 
10 |
--------------------------------------------------------------------------------
/_posts/02-dataflow/2017-02-04-blackboard.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Blackboard
4 | tags: dataflow cpsa-f _TODO
5 | category: dataflow
6 | permalink: /patterns/blackboard/
7 | ---
8 |
9 | ## Blackboard
10 |
11 | ### Context
12 |
13 | An immature domain in which no closed approach to a solution is known or feasible.
14 |
15 | ### Problem
16 |
17 | No feasible deterministic solution for data transformation into high-level data structures. The domain has uncertain or approximate knowledge. The transformations can result into many alternatives.
18 |
19 | ### Forces
20 |
21 | * A complete search of the solution space is not feasible in a reasonable time
22 |
23 | * Immature Domain
24 |
25 | * Different algorithms that solve partial problems
26 |
27 | * Input, as well as intermediate and final results, have different representations
28 |
29 | * An algorithm usually works on the results of other algorithms
30 |
31 | * Uncertain data and approximate solutions are involved
32 |
33 | * Employing disjoint algorithms induces potential parallelism
34 |
35 | ### Consequences
36 |
37 | * Experimentation
38 |
39 | * Support for changeability and maintainability
40 |
41 | * Reusable knowledge sources
42 |
43 | * Support for fault tolerance and robustness
44 |
45 | ### Liabilites
46 |
47 | * Difficulty of testing
48 |
49 | * No good solution is guaranteed
50 |
51 | * Difficulty of estabilishing a good control strategy
52 |
53 | * Low Efficiency
54 |
55 | * High devlopment effort
56 |
57 | * No support for parallelism
58 |
59 |
--------------------------------------------------------------------------------
/_posts/03-interactive/2017-04-01-mvc.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Model-View-Controller
4 | tags: interactive cpsa-f _TODO
5 | category: interactive
6 | permalink: /patterns/mvc/
7 | ---
8 |
9 | ## Context
10 | Interactive application with a flexible human-computer interface
11 |
12 |
13 | ## Intent
14 | The pattern isolates (business or domain) logic from input and presentation, permitting independent development, testing and maintenance of each.
15 |
16 | ## Participants
17 |
18 | 
19 |
20 | ### Model
21 | It is the domain-specific representation of data,
22 | on which the application operates.
23 |
24 | ### View
25 | Renders the model into a form suitable for interaction, typically a user interface element. Multiple views can exist for a single model for different purposes.
26 |
27 | Views don't need to be graphical, but can also be plain textual. The common denominator of the views is that they
28 | expose certain model information to some _outside world_.
29 |
30 | ### Controller
31 | Receives input and initiates a response by making calls on model objects.
32 |
33 |
34 | ### MVC triads
35 | An MVC application may be a collection of model/view/controller triplets, each responsible for a different UI element.
36 |
37 |
38 | ## Advantages
39 |
40 | * clear and clean separation of concerns.
41 | * is easy to test code that implements this pattern.
42 | * promotes better code organization and extensibility.
43 | * facilitates de-coupling of the application's components.
44 |
45 | ## Liabilities
46 |
47 | * Potential of excessive number of updates
48 | * Intimate connection between view and controller
49 |
50 | MVC isolates the application’s presentation that displays (or otherwise exposes) (model) data in the user interface, from the way the data is actually processed.
51 |
52 | In other words, it isolates the application’s data from how the data is actually processed by the application’s business logic.
53 |
54 | The main advantage of the MVC design pattern is the isolation of these components: Developers might change any one of them without the rest being affected.
55 |
--------------------------------------------------------------------------------
/_posts/04-integration/2016-05-01-file-transfer.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: File-Transfer
4 | tags: integration _TODO
5 | category: integration
6 | permalink: /patterns/file-transfer/
7 | ---
8 |
9 | #### Problem
10 |
11 | How can I integrate multiple applications so that they can work together and can
12 | exchange information, independend of implementation technology and operating systems?
13 |
14 | #### Solution
15 |
16 | Have each application produce files that the other application can consume.
17 |
18 | 
19 |
20 |
21 | #### References
22 |
23 | * [Hohpe+03](http://www.enterpriseintegrationpatterns.com/patterns/messaging/FileTransferIntegration.html)
24 |
--------------------------------------------------------------------------------
/_posts/04-integration/2016-05-02-messaging.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Messaging
4 | tags: integration _TODO
5 | category: integration
6 | permalink: /patterns/messaging/
7 | ---
8 |
9 | #### Problem
10 |
11 | How can I integrate multiple applications so that they can work together and can
12 | exchange information, independend of implementation technology and operating systems?
13 |
14 | #### Solution
15 |
16 | Use Messaging to transfer packets of data frequently, immediately, reliably, and
17 | asynchronously, using customizable formats.
18 |
19 | {: .align-left}
20 |
21 | #### References
22 |
23 | * [Hohpe+03](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Messaging.html)
24 |
--------------------------------------------------------------------------------
/_posts/04-integration/2016-05-03-rpc.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Remote Procedure Call
4 | tags: integration _TODO
5 | category: integration
6 | permalink: /patterns/rpc/
7 | ---
8 |
9 | #### Problem
10 |
11 | How can I integrate multiple applications so that they can work together and can
12 | exchange information?
13 |
14 | #### Solution
15 |
16 | Develop each application as a large-scale object or component with encapsulated data.
17 | Provide an interface to allow other applications to interact with the running application.
18 |
19 | #### References
20 |
21 | * [Hohpe+03](http://www.enterpriseintegrationpatterns.com/patterns/messaging/EncapsulatedSynchronousIntegration.html)
22 |
--------------------------------------------------------------------------------
/_posts/04-integration/2016-05-04-shared-database.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Shared Database
4 | tags: integration _TODO
5 | category: integration
6 | permalink: /patterns/shared-database/
7 | ---
8 |
9 | #### Problem
10 |
11 | How can I integrate multiple applications so that they can work together and can
12 | exchange information?
13 |
14 | #### Solution
15 |
16 | Integrate applications by having them store their data in a single Shared Database.
17 |
18 | #### References
19 |
20 | * [Hohpe+03](http://www.enterpriseintegrationpatterns.com/patterns/messaging/SharedDataBaseIntegration.html)
21 |
--------------------------------------------------------------------------------
/_posts/04-integration/2016-05-05-publish-subscribe.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Publish Subscribe
4 | tags: integration _TODO cpsa-f
5 | category: integration
6 | permalink: /patterns/publish-subscribe/
7 | ---
8 |
9 | #### Problem
10 |
11 | How can the sender broadcast an event to all interested receivers?
12 |
13 | #### Solution
14 |
15 | Send the event on a Publish-Subscribe Channel, which delivers a copy of a particular event to each receiver.
16 |
17 | * Senders of messages, called publishers, characterize published messages into classes without knowledge of subscribers
18 | * Subscribers express interest in one or more classes of messages and only receive messages that are of interest, without knowledge of which publishers.
19 |
20 | #### References
21 |
22 | * [Hohpe+03](http://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html)
23 | * [Wikipedia](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern)
24 | * [Microsoft Patterns and Practices](https://msdn.microsoft.com/en-us/library/ff649664.aspx)
25 |
--------------------------------------------------------------------------------
/_posts/05-adaptive/2017-03-01-plugin.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Plugin
4 | tags: adaptive runtime-flexibility cpsa-f _TODO
5 | category: adaptive
6 | permalink: /patterns/plugin/
7 | ---
8 |
--------------------------------------------------------------------------------
/_posts/05-adaptive/2017-03-02-broker.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Broker
4 | tags: adaptive runtime-flexibility cpsa-f
5 | category: adaptive
6 | permalink: /patterns/broker/
7 | ---
8 |
9 | #### Context
10 |
11 | You have a distributed and maybe heterogeneous system with indipendent cooperating components.
12 |
13 | #### Problem
14 |
15 | How can I let parts of an application cooperate,
16 | even when they exist/run in different runtime environments?
17 |
18 | These environments might change over time...
19 |
20 | #### Solution
21 | The Broker pattern can be used to structure distributed software systems with decoupled elements that interact by remote service invocations. The broker is responsible for coordinating communication, such as forwarding requests, as well as for transmitting results and exceptions/errors.
22 |
23 | Components interact with the broker via stubs and skeletons,
24 | that can be automatically generated.
25 |
26 | 
27 |
28 | #### Consequences
29 |
30 | * Location Transparency
31 | * Changeability and extensibility of components
32 | * Portability of a Broker system, the network layer is hidden from clients and servers
33 | * Interoperability between different Broker systems
34 | * Reusability, new Clients can rely on existing servers
35 | * Isolation of services
36 |
37 | #### Liabilities
38 |
39 | * Restricted efficiency
40 | * Lower fault tolerance, server and clients that don't work properly will affect many other clients/servers
41 | * Testing and Debugging ist tedious over the entire system
42 |
43 | #### References
44 |
45 | CORBA (common object request broker architecture) is a
46 | well-known application of this pattern.
47 |
48 | See for example the [CORBA](http://www.corba.org/) website.
49 |
--------------------------------------------------------------------------------
/_posts/05-adaptive/2017-03-03-microservice.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Microservices
4 | tags: adaptive overall cpsa-f _TODO
5 | category: [adaptive,overall]
6 | permalink: /patterns/microservice/
7 | ---
8 |
--------------------------------------------------------------------------------
/_posts/07-stability/2016-06-01-timeout.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Timeout
4 | tags: stability _TODO
5 | category: stability
6 | permalink: /patterns/timeout/
7 | ---
8 |
9 | #### Problem
10 |
11 | How can I:
12 |
13 | * Preserve responsiveness independent of downstream latency
14 | * Stop waiting after a pre-determined period of time
15 | * Take alternate action if timeout was reached
16 |
17 |
18 | #### Solution
19 |
20 | Allow only a specified period of time to elapse before a specified event is to take place,
21 | unless another specified event occurs first;
22 | in either case, the period is terminated when either event takes place.
23 |
24 | For an example of practical application of _timeout_, see the
25 | [CircuitBreaker stability pattern](), first described
26 | by [Michael Nygard](https://pragprog.com/book/mnee/release-it).
27 |
28 |
29 | #### References
30 |
31 | * [Wikipedia](https://en.wikipedia.org/wiki/Timeout_(computing))
32 | * [Patterns of Resilience (by Uwe Friedrichsen)](https://www.slideshare.net/ufried/patterns-of-resilience)
33 | * [CircuitBreaker pattern](/patterns/circuit-breaker)
34 |
--------------------------------------------------------------------------------
/_posts/07-stability/2016-06-02-circuit-breaker.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Circuit-Breaker
4 | tags: stability _TODO
5 | category: stability
6 | permalink: /patterns/circuit-breaker/
7 | ---
8 |
9 | #### Problem
10 |
11 | If you have many callers on a unresponsive supplier,
12 | then you might run out of critical resources leading to cascading failures
13 | across multiple parts of your systems.
14 |
15 |
16 | #### Solution
17 |
18 |
19 | #### References
20 |
21 | * [CircuitBreaker pattern](/patterns/circuit-breaker)
22 |
--------------------------------------------------------------------------------
/_posts/10-design/2016-10-01-adapter.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Adapter
4 | tags: design-pattern cpsa-f interfacing
5 | category: design
6 | permalink: /patterns/adapter/
7 | ---
8 |
9 |
10 | **Intent**: Adapter makes otherwise incompatible elements cooperate.
11 |
12 | **Problem**: An existing component offers some functionality that you would like to use,
13 | but its "view of the world" (its interface to the functionality) is not diretly
14 | compatible with your system. You need some way of _translating_ or _adapting_.
15 |
16 | **Solution**
17 |
18 | {:width="35%"}
19 |
20 | Image from [SparkFunElectronics](https://www.flickr.com/photos/sparkfun/) on [Flickr](https://www.flickr.com/photos/sparkfun/10983625764/)
21 |
--------------------------------------------------------------------------------
/_posts/10-design/2016-10-02-facade.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Facade
4 | tags: design-pattern cpsa-f interfacing
5 | category: design
6 | permalink: /patterns/facade/
7 | ---
8 |
9 | **Intent**: Facade provides a simpler interface to a complicated subsystem.
10 |
11 | **Problem**: An existing subsystem is complicated or difficult to use. A consumer wants to access
12 | this subsystem, but does not want to use the complicated interface.
13 |
14 | **Solution**
15 |
16 | Create a "convenience interface" that facilitates access to the complex subsystem.
17 | Such a facade might require internal logic or processing.
18 |
19 | See the following _real world_ example:
20 |
21 | {:width="70%"}
22 |
23 |
24 | **Remarks**
25 |
26 | * Facade defines a new interface, whereas Adapter uses an existing interface.
27 |
--------------------------------------------------------------------------------
/_posts/10-design/2016-10-03-proxy.md:
--------------------------------------------------------------------------------
1 | ---
2 | layout: post
3 | title: Proxy
4 | tags: design-pattern cpsa-f interfacing
5 | category: design
6 | permalink: /patterns/proxy/
7 | ---
8 |
9 | #### Intent
10 | A proxy represents another element, provides a surrogate or placeholder for another element,
11 | e.g. to control access or add functionality to it.
12 |
13 | #### Problem
14 | Some elements (in the figure below it's called `RealSubject`) might be
15 | resource-intensive, overloaded or difficult to enhance.
16 |
17 | #### Solution
18 |
19 | The proxy (placeholder) provides _exactly the same interface as the original object_.
20 | In the following figure it's called `doSomething()`. A Consumer needing
21 | `doSomething()` gets a reference to the `Proxy` instead of the `RealSubject`.
22 |
23 | The proxy can control access to the real subject, can cache results or defer calls. No
24 | change is needed an the consumer and the real subject.
25 |
26 | 
27 |
28 | #### Known Applications
29 |
30 | * Security (or protection) Proxy: can be used to control access to a resource.
31 |
32 | * Remote Proxy: In distributed (object) programming, a local object (_proxy_) represents a remote object
33 | (one that lives in a different address space).
34 |
35 | * Virtual Proxy: If some resource is _expensive_ in terms of memory, capacity, computing power or similar,
36 | a proxy (skeleton) implementation might be helpful sometimes.
37 |
38 | * Caching Proxy: Stores results that have already been computed by the original object.
39 |
40 |
41 |
42 | #### Remarks
43 |
44 | * Adapter provides a different interface to its subject. Proxy provides the same interface.
45 |
--------------------------------------------------------------------------------
/_sass/_aside.scss:
--------------------------------------------------------------------------------
1 | .site-aside {
2 | font-size: 0.95em;
3 | padding-top: $margin;
4 | padding-bottom: $margin;
5 |
6 | @media screen and (max-width: $mobile-width) {
7 | border-top: 3px solid $brand-color;
8 |
9 | .js & {
10 | display: none;
11 |
12 | &.active {
13 | display: block;
14 | }
15 | }
16 | }
17 |
18 | h1 {
19 | font-size: 1.2em;
20 | line-height: 1.3;
21 | margin: 1em 0;
22 | }
23 |
24 | .block {
25 | margin-bottom: $margin;
26 | h1 {
27 | margin: 0;
28 | }
29 | }
30 |
31 | #search {
32 | box-sizing: border-box;
33 | width: 100%;
34 | }
35 |
36 | ol, ul {
37 | margin: 1.5em 0;
38 | list-style: none;
39 | line-height: 1.2em;
40 | li {
41 | border-bottom: 1px solid $border-color;
42 | &:first-child {
43 | border-top: 1px solid $border-color;
44 | }
45 | a, span {
46 | padding: 0.5em 0.3em;
47 | display: block;
48 | width: 100%;
49 | }
50 | &:last-child {
51 | margin-bottom: 0;
52 | }
53 | }
54 | }
55 |
56 | ul.icons {
57 | @extend .clearfix;
58 | list-style: none;
59 | li {
60 | border: none;
61 | font-size: 1.8em;
62 | margin-bottom: 0;
63 | float: left;
64 | a {
65 | padding: 0;
66 | }
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/_sass/_common.scss:
--------------------------------------------------------------------------------
1 | html {
2 | background: $background-color;
3 | }
4 |
5 | body {
6 | color: $text-color;
7 | font-family: $font-family;
8 | font-size: $font-size;
9 | word-wrap: break-word;
10 | }
11 |
12 | a {
13 | color: $link-color;
14 | text-decoration: none;
15 | &:hover {
16 | opacity: .8;
17 | text-decoration: underline;
18 | }
19 | }
20 |
21 | hr {
22 | border: 0;
23 | border-top: 1px solid $border-color;
24 | border-bottom: 1px solid #fff;
25 | margin: 1em 0;
26 | &.with-margin {
27 | margin: $margin 0;
28 | }
29 | &.with-no-margin {
30 | margin: 0;
31 | }
32 | }
33 |
34 | input, select, textarea {
35 | border-radius: 0.3em;
36 | border: 1px solid $border-color;
37 | display: inline-block;
38 | padding: 0.5em 0.75em;
39 | }
40 |
41 | iframe, img, embed, object, video {
42 | max-width: 100%;
43 | }
44 |
45 |
46 | /*****************************************************************************/
47 | /*
48 | /* Tags
49 | /* thx to https://github.com/lanyonm/lanyonm.github.io
50 | /*****************************************************************************/
51 |
52 | .tag-box {
53 | list-style: none;
54 | margin: 0;
55 | padding: 4px 0;
56 | overflow: hidden;
57 | *zoom: 1;
58 | }
59 |
60 | .tag-box:before, .tag-box:after {
61 | display: table;
62 | content: "";
63 | line-height: 0;
64 | }
65 |
66 | .tag-box:after {
67 | clear: both;
68 | }
69 |
70 | .tag-box.inline li {
71 | float: left;
72 | font-size: 14px;
73 | font-size: 1.0rem;
74 | line-height: 2.5;
75 | }
76 |
77 | .tag-box a {
78 | padding: 4px 6px;
79 | margin: 2px;
80 | background-color: #ccffcc;
81 | -webkit-border-radius: 4px;
82 | -moz-border-radius: 4px;
83 | border-radius: 4px;
84 | text-decoration: none;
85 | }
86 |
87 | .tag-box a span {
88 | vertical-align: super;
89 | font-size: 12px;
90 | font-size: 0.625rem;
91 | }
92 |
--------------------------------------------------------------------------------
/_sass/_content.scss:
--------------------------------------------------------------------------------
1 | .site-content {
2 | h1, h2, h3, h4, h5, h6 {
3 | line-height: 1.3;
4 | margin: 1em 0;
5 | a {
6 | color: $text-color;
7 | }
8 | .header-link {
9 | margin-left: 0.2em;
10 | color: $link-color;
11 | opacity: 0;
12 | }
13 | &:hover .header-link {
14 | opacity: 1;
15 | }
16 | }
17 |
18 | h1 {
19 | font-size: 2.3em;
20 | }
21 |
22 | h2 {
23 | font-size: 1.8em;
24 | color: $link-color
25 | }
26 |
27 | blockquote {
28 | border-left: 5px solid #ddd;
29 | color: $blockquote-color;
30 | padding: 0.5em 1em;
31 | p:first-child {
32 | margin-top: 0;
33 | }
34 | p:last-child {
35 | margin-bottom: 0;
36 | }
37 | }
38 |
39 | table {
40 | width: 100%;
41 | border-collapse: collapse;
42 | td, th {
43 | padding: 0.5em 1em;
44 | border: 1px solid $border-color;
45 | text-align: left;
46 | }
47 | }
48 |
49 | p, ol, ul, dl, table, blockquote, kbd, pre, samp {
50 | margin: 1.5em 0;
51 | }
52 |
53 | ul, ol {
54 | padding-left: 1em;
55 | ul, ol {
56 | margin: 0;
57 | }
58 | }
59 |
60 | ul, ol {
61 | &.inline {
62 | @extend .clearfix;
63 | list-style: none;
64 | padding-left: 0;
65 | li {
66 | float: left;
67 | margin-right: 1em;
68 | &:last-child {
69 | margin-right: 0;
70 | }
71 | }
72 | }
73 | }
74 |
75 | dt {
76 | font-weight: bold;
77 | }
78 |
79 | dd {
80 | margin-left: 2em;
81 | }
82 |
83 | p, ol, ul, dl {
84 | line-height: 1.5;
85 | }
86 |
87 | ol, ul {
88 | list-style-position: outside;
89 | }
90 |
91 | code {
92 | font-family: $code-font-family;
93 | font-size: $code-font-size;
94 | margin: 0 2px;
95 | padding: 0 5px;
96 | border: 1px solid #ddd;
97 | background-color: rgba(#ddd, .1);
98 | border-radius: 3px;
99 | }
100 |
101 | pre {
102 | border: 1px solid #ccc;
103 | background-color: rgba(#ddd, .1);
104 | overflow: auto;
105 | padding: 10px 15px;
106 | line-height: 1em;
107 | border-radius: 3px;
108 | code {
109 | margin: 0;
110 | padding: 0;
111 | word-wrap: normal;
112 | white-space: pre;
113 | border: none;
114 | background: transparent;
115 | }
116 | }
117 |
118 | .article-wrapper {
119 | @extend .clearfix;
120 | margin: $margin 0;
121 | }
122 |
123 | article {
124 | width: 100%;
125 | float: left;
126 | header {
127 | margin-bottom: $margin;
128 | .panel {
129 | padding: 1em 1.5em;
130 | background-color: rgba($site-title-color, .2);
131 | h1 {
132 | margin: 0;
133 | &, a {
134 | color: $dark-brand-color;
135 | }
136 | }
137 | ul.meta, ul.tags {
138 | list-style: none;
139 | margin: 0;
140 | padding: 0;
141 | li {
142 | display: inline-block;
143 | color: rgba($text-color, .5);
144 | font-size: 0.95em;
145 | margin-right: 0.5em;
146 | &:last-child {
147 | margin-right: 0;
148 | }
149 | }
150 | }
151 | ul.meta {
152 | float: right;
153 | }
154 | ul.icons {
155 | margin: 0;
156 | padding: 0;
157 | li {
158 | margin-right: 0;
159 | }
160 | }
161 | }
162 | }
163 | p:last-child {
164 | margin-bottom: 0;
165 | }
166 | footer {
167 | margin-top: $margin;
168 | }
169 | .footnotes {
170 | font-size: 0.9em;
171 | }
172 | }
173 |
174 | .comments {
175 | margin-bottom: $margin;
176 | }
177 |
178 | .pagination {
179 | margin: $margin 0;
180 | padding: 0 10%;
181 | text-align: center;
182 | .btn:first-child {
183 | margin-right: 1em;
184 | }
185 | }
186 |
187 | #search-results {
188 | .article-wrapper {
189 | margin: 1em 0;
190 | }
191 | article header {
192 | margin-bottom: 0;
193 | .panel {
194 | padding: 0;
195 | background-color: $background-color;
196 | h1 {
197 | font-size: 1.3em;
198 | color: $title-color;
199 | a.tag {
200 | font-size: 0.7em;
201 | }
202 | }
203 | }
204 | }
205 | }
206 | }
207 |
--------------------------------------------------------------------------------
/_sass/_footer.scss:
--------------------------------------------------------------------------------
1 | .site-footer {
2 | border-top: 3px solid $dark-brand-color;
3 | padding: $margin/2 0;
4 | color: lighten($text-color, 30%);
5 | text-align: center;
6 | font-size: 0.9em;
7 | }
8 |
--------------------------------------------------------------------------------
/_sass/_header.scss:
--------------------------------------------------------------------------------
1 | .site-header {
2 | font-size: 2.7em;
3 | padding: 0.7em 0;
4 | background-color: $brand-color;
5 | border-top: 3px solid $border-contrast-color;
6 | border-bottom: 3px solid $border-contrast-color;
7 | @media screen and (max-width: $mobile-width) {
8 | position: relative;
9 | text-align: center;
10 | }
11 |
12 | .nav-toggle {
13 | display: none;
14 |
15 | background-color: transparent;
16 | border: 0;
17 |
18 | @media screen and (max-width: $mobile-width) {
19 | .js & {
20 | display: inline;
21 |
22 | position: absolute;
23 | top: $side-padding;
24 | right: $side-padding;
25 |
26 | outline: none;
27 |
28 | &.active {
29 | color: #fff;
30 | }
31 | }
32 | }
33 | }
34 |
35 | .avatar {
36 | height: 3em;
37 | width: 3em;
38 | border: 3px solid rgba(#fff, .7);
39 | border-radius: 1.5em;
40 | margin-right: 0.8em;
41 | float: left;
42 | @media screen and (max-width: $mobile-width) {
43 | float: none;
44 | margin-right: 0;
45 | }
46 | }
47 |
48 | h1 {
49 | font-size: 1em;
50 | line-height: 1em;
51 | margin: 0;
52 | .title {
53 | display: inline-block;
54 | color: $site-title-color;
55 | font-weight: bold;
56 | margin-top: 0.5em;
57 | &.slim {
58 | margin-top: 0;
59 | }
60 | @media screen and (max-width: $mobile-width) {
61 | margin-top: 0;
62 | }
63 | }
64 | .description {
65 | margin: 0;
66 | font-size: 0.6em;
67 | line-height: 1em;
68 | margin-top: 0.5em;
69 | /* original: color: lighten($site-title-color, 20%);
70 | */
71 | color: #fe5a83;
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/_sass/base/_layout.scss:
--------------------------------------------------------------------------------
1 | $site-max-width: 1200px;
2 | $mobile-width: 800px;
3 | $side-padding: 10px;
4 |
5 | * {
6 | margin: 0;
7 | padding: 0;
8 | box-sizing: border-box;
9 | }
10 |
11 | .site-header {
12 | width: 100%;
13 | .inner {
14 | width: $site-max-width;
15 | margin: 0 auto;
16 | @media screen and (max-width: $site-max-width) {
17 | width: 100%;
18 | padding: 0 $side-padding;
19 | }
20 | }
21 | }
22 |
23 | .site-container {
24 | @extend .clearfix;
25 | width: $site-max-width;
26 | margin: 0 auto;
27 | @media screen and (max-width: $site-max-width) {
28 | width: 100%;
29 | padding: 0 $side-padding;
30 | }
31 | @media screen and (max-width: $mobile-width) {
32 | padding: 0;
33 | }
34 | }
35 |
36 | .site-content {
37 | width: 100%;
38 | padding: 0 $side-padding;
39 |
40 | @media screen and (min-width: $mobile-width) {
41 | width: 70%;
42 | float: left;
43 | padding-right: 0;
44 | padding-left: 0;
45 | }
46 | }
47 |
48 | .site-aside {
49 | padding-left: 50px;
50 | width: 30%;
51 | float: right;
52 | @media screen and (max-width: $mobile-width) {
53 | width: 100%;
54 | padding: 0 $side-padding;
55 | }
56 | .inner {
57 | }
58 | }
59 |
60 | .site-footer {
61 | width: 100%;
62 | .inner {
63 | padding: 0 $side-padding;
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/_sass/base/_reset.scss:
--------------------------------------------------------------------------------
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 | -ms-text-size-adjust: 100%; /* 2 */
12 | -webkit-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 | font-size: 2em;
137 | margin: 0.67em 0;
138 | }
139 |
140 | /**
141 | * Address styling not present in IE 8/9.
142 | */
143 |
144 | mark {
145 | background: #ff0;
146 | color: #000;
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 | font-size: 75%;
164 | line-height: 0;
165 | position: relative;
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 | -moz-box-sizing: content-box;
213 | box-sizing: content-box;
214 | height: 0;
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 | color: inherit; /* 1 */
258 | font: inherit; /* 2 */
259 | margin: 0; /* 3 */
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 | border: 0;
314 | padding: 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-appearance: textfield; /* 1 */
359 | -moz-box-sizing: content-box;
360 | -webkit-box-sizing: content-box; /* 2 */
361 | box-sizing: content-box;
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 | border: 1px solid #c0c0c0;
381 | margin: 0 2px;
382 | padding: 0.35em 0.625em 0.75em;
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 | border: 0; /* 1 */
392 | padding: 0; /* 2 */
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-collapse: collapse;
421 | border-spacing: 0;
422 | }
423 |
424 | td,
425 | th {
426 | padding: 0;
427 | }
428 |
--------------------------------------------------------------------------------
/_sass/base/_syntax.scss:
--------------------------------------------------------------------------------
1 | // from https://github.com/mojombo/tpw/blob/master/css/syntax.css
2 | // see also https://jekyllrb.com/docs/templates/#stylesheets-for-syntax-highlighting
3 |
4 | .highlight { background: #ffffff; }
5 | .highlight .c { color: #999988; font-style: italic } /* Comment */
6 | .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
7 | .highlight .k { font-weight: bold } /* Keyword */
8 | .highlight .o { font-weight: bold } /* Operator */
9 | .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
10 | .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
11 | .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
12 | .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
13 | .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
14 | .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
15 | .highlight .ge { font-style: italic } /* Generic.Emph */
16 | .highlight .gr { color: #aa0000 } /* Generic.Error */
17 | .highlight .gh { color: #999999 } /* Generic.Heading */
18 | .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
19 | .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
20 | .highlight .go { color: #888888 } /* Generic.Output */
21 | .highlight .gp { color: #555555 } /* Generic.Prompt */
22 | .highlight .gs { font-weight: bold } /* Generic.Strong */
23 | .highlight .gu { color: #aaaaaa } /* Generic.Subheading */
24 | .highlight .gt { color: #aa0000 } /* Generic.Traceback */
25 | .highlight .kc { font-weight: bold } /* Keyword.Constant */
26 | .highlight .kd { font-weight: bold } /* Keyword.Declaration */
27 | .highlight .kp { font-weight: bold } /* Keyword.Pseudo */
28 | .highlight .kr { font-weight: bold } /* Keyword.Reserved */
29 | .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
30 | .highlight .m { color: #009999 } /* Literal.Number */
31 | .highlight .s { color: #d14 } /* Literal.String */
32 | .highlight .na { color: #008080 } /* Name.Attribute */
33 | .highlight .nb { color: #0086B3 } /* Name.Builtin */
34 | .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
35 | .highlight .no { color: #008080 } /* Name.Constant */
36 | .highlight .ni { color: #800080 } /* Name.Entity */
37 | .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
38 | .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
39 | .highlight .nn { color: #555555 } /* Name.Namespace */
40 | .highlight .nt { color: #000080 } /* Name.Tag */
41 | .highlight .nv { color: #008080 } /* Name.Variable */
42 | .highlight .ow { font-weight: bold } /* Operator.Word */
43 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */
44 | .highlight .mf { color: #009999 } /* Literal.Number.Float */
45 | .highlight .mh { color: #009999 } /* Literal.Number.Hex */
46 | .highlight .mi { color: #009999 } /* Literal.Number.Integer */
47 | .highlight .mo { color: #009999 } /* Literal.Number.Oct */
48 | .highlight .sb { color: #d14 } /* Literal.String.Backtick */
49 | .highlight .sc { color: #d14 } /* Literal.String.Char */
50 | .highlight .sd { color: #d14 } /* Literal.String.Doc */
51 | .highlight .s2 { color: #d14 } /* Literal.String.Double */
52 | .highlight .se { color: #d14 } /* Literal.String.Escape */
53 | .highlight .sh { color: #d14 } /* Literal.String.Heredoc */
54 | .highlight .si { color: #d14 } /* Literal.String.Interpol */
55 | .highlight .sx { color: #d14 } /* Literal.String.Other */
56 | .highlight .sr { color: #009926 } /* Literal.String.Regex */
57 | .highlight .s1 { color: #d14 } /* Literal.String.Single */
58 | .highlight .ss { color: #990073 } /* Literal.String.Symbol */
59 | .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
60 | .highlight .vc { color: #008080 } /* Name.Variable.Class */
61 | .highlight .vg { color: #008080 } /* Name.Variable.Global */
62 | .highlight .vi { color: #008080 } /* Name.Variable.Instance */
63 | .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
64 |
--------------------------------------------------------------------------------
/_sass/base/_utilities.scss:
--------------------------------------------------------------------------------
1 | // button.
2 | .btn {
3 | border-radius: 0.3em;
4 | border: 1px solid;
5 | display: inline-block;
6 | padding: 0.5em 0.75em;
7 | }
8 | a.btn:hover {
9 | background: $link-color;
10 | color: $background-color;
11 | text-decoration: none;
12 | }
13 |
14 | // margin.
15 | .margin {
16 | margin: $margin 0 !important;
17 | }
18 | .margin-top {
19 | margin-top: $margin !important;
20 | }
21 | .margin-bottom {
22 | margin-bottom: $margin !important;
23 | }
24 |
25 | // state.
26 | .disabled {
27 | opacity: 0.7;
28 | }
29 |
30 | // clearfix.
31 | .clearfix {
32 | &:before, &:after {
33 | content: " ";
34 | display: table;
35 | }
36 | &:after {
37 | clear: both;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/_sass/base/_variables.scss:
--------------------------------------------------------------------------------
1 | // typography.
2 | $font-family: 'Source Sans Pro', Helvetica, Arial, sans-serif;
3 | $font-size: 16px;
4 |
5 | // source code typography.
6 | $code-font-family: Consolas, Monaco, 'Andale Mono', monospace;
7 | $code-font-size: 0.85em;
8 |
9 | // vertical margin.
10 | $margin: 50px;
11 |
12 | // brand color.
13 | $brand-color: #ccffcc;
14 | //$brand-color: #277bc6;
15 | $dark-brand-color: #005510;
16 |
17 | // other major colors.
18 | $site-title-color: #005510;
19 | $title-color: #005510;
20 | // original: $site-title-color: rgba(#000, .6);
21 | $page-title-color: $brand-color;
22 | $background-color: #fff;
23 | $border-color: rgba(#000, .1);
24 | $border-contrast-color: $site-title-color;
25 |
26 | // typography colors.
27 | $text-color: #383838;
28 | $link-color: #1675b9;
29 | $blockquote-color: #777;
30 |
--------------------------------------------------------------------------------
/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/android-chrome-192x192.png
--------------------------------------------------------------------------------
/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/android-chrome-512x512.png
--------------------------------------------------------------------------------
/apple-touch-icon-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/apple-touch-icon-precomposed.png
--------------------------------------------------------------------------------
/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/apple-touch-icon.png
--------------------------------------------------------------------------------
/arc42-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/arc42-logo.png
--------------------------------------------------------------------------------
/assets/css/arc42-doc.css:
--------------------------------------------------------------------------------
1 | /* style for arc42 websites */
2 |
3 | p {
4 | font-family: sans-serif;
5 | }
6 |
7 | /* unified style for template help */
8 | .arc42-help {
9 | color: #002080;
10 | padding: 5px 5px;
11 | background: #dcf0ff;
12 | border-radius: 4px;
13 |
14 | -webkit-box-shadow: 3px 3px 4px 0px rgba(11,82,185,1);
15 | -moz-box-shadow: 3px 3px 4px 0px rgba(11,82,185,1);
16 | box-shadow: 3px 3px 4px 0px rgba(11,82,185,1);
17 | }
18 |
19 | /* use before-pseudo-class to add icon */
20 | .arc42-help::before {
21 | display: block;
22 | float: right;
23 | width: 24px;
24 | height: 26px;
25 |
26 | content: "";
27 | background: url("./help42.svg") no-repeat;
28 | background-size: 24px 26px;
29 | }
30 |
31 | /* subtle ads */
32 |
33 | .subtle-ad {
34 | width: 70%;
35 | margin: 5px;
36 | padding: 5px;
37 |
38 | background-color: rgba(254, 228, 228, 0.3);
39 | border-radius: 4px;
40 | border-style: solid;
41 | border-width: 1px;
42 | border-color: #800000;
43 |
44 | -webkit-box-shadow: 3px 3px 4px 0px rgba(156,61,75,1);
45 | -moz-box-shadow: 3px 3px 4px 0px rgba(156,61,75,1);
46 | box-shadow: 3px 3px 4px 0px rgba(156,61,75,1);
47 |
48 | font-family: "Palatino Linotype", "Book Antiqua", serif;
49 | color: #032f7f;
50 | }
51 |
52 | /* use before-pseudo-class to add icon */
53 | .subtle-ad::before {
54 | display: block;
55 | float: right;
56 | width: 50px;
57 | height: 80px;
58 |
59 | content: "";
60 | background: url("./arc42-exclamation.svg") no-repeat;
61 | background-size: 80px 80px;
62 | }
63 |
64 |
65 | .subtle-ad h4 {
66 | line-height: 1.2pt;
67 | margin-top: 5px;
68 | }
69 |
70 | .subtle-ad a {
71 | color: ff796a;
72 | }
73 |
--------------------------------------------------------------------------------
/assets/css/arc42-exclamation.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
13 |
16 |
17 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/assets/css/help42.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/assets/css/style.scss:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 | @import 'base/_reset';
5 | @import 'base/_syntax';
6 | @import 'base/_variables';
7 | @import 'base/_layout';
8 | @import 'base/_utilities';
9 | @import '_common';
10 | @import '_header';
11 | @import '_footer';
12 | @import '_aside';
13 | @import '_content';
14 | @import 'arc42-doc.css';
15 |
--------------------------------------------------------------------------------
/assets/img/arc42-favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 | Created by potrace 1.11, written by Peter Selinger 2001-2013
9 |
10 |
12 |
24 |
29 |
35 |
40 |
49 |
54 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/assets/img/arc42logosquare.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/assets/img/arc42logosquare.png
--------------------------------------------------------------------------------
/assets/img/doc42icon.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 42
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/assets/img/innoQ-logo-bw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/assets/img/innoQ-logo-bw.png
--------------------------------------------------------------------------------
/assets/img/ugly-404.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/assets/img/ugly-404.png
--------------------------------------------------------------------------------
/assets/js/header-link.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 | $("h1, h2, h3, h4, h5, h6").each(function () {
3 | var id = $(this).attr("id");
4 | if (id) {
5 | $(this).append($(" ").addClass("header-link").attr("href", "#" + id).html(' '));
6 | }
7 | });
8 | });
9 |
--------------------------------------------------------------------------------
/assets/js/script.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 | // enable navigation toggle
3 | $('.nav-toggle').on('click', function(e) {
4 | e.preventDefault();
5 | var toggle = $(e.target);
6 | var target = $(toggle.data('target'));
7 |
8 | if (target.length) {
9 | toggle.toggleClass('active');
10 | target.toggleClass('active');
11 | }
12 | });
13 |
14 | // focus on search input with '/' key.
15 | $("body").on("keyup", function (e) {
16 | e.stopPropagation();
17 | var slashKeys = [47, 111, 191];
18 | if (slashKeys.some(function (value) { return e.keyCode == value })) {
19 | $("#search").focus();
20 | }
21 | });
22 |
23 | // add `target="_blank"` into all outer links.
24 | var host = document.location.host;
25 | $("a[href]").each(function() {
26 | var re = new RegExp(host, "g");
27 | if ($(this).attr("href").match(/\/\//) && !$(this).attr("href").match(re)) {
28 | $(this).attr("target", "_blank");
29 | }
30 | });
31 |
32 | // center and linkable all images.
33 | var $images = $("article img:not(.emoji, .eye-catch)");
34 | $images.closest("p").css("text-align", "center");
35 | $images.each(function () {
36 | var imgUrl = $(this).attr("src");
37 | var $a = $("").attr("href", imgUrl).attr("target", "_blank");
38 | $(this).wrap($a);
39 | });
40 |
41 | // stick aside.
42 | var topSpacing = $(".site-aside").css("padding-top").replace(/px/, "");
43 | $(".site-aside .sticky").sticky({
44 | topSpacing: parseInt(topSpacing)
45 | });
46 | });
47 |
--------------------------------------------------------------------------------
/assets/js/search.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 | var query = getQuery(["q", "t", "a", "d"]);
3 |
4 | var targets;
5 | switch (query.key) {
6 | case "t":
7 | targets = ["tags"];
8 | break;
9 | case "a":
10 | targets = ["author"];
11 | break;
12 | case "d":
13 | targets = ["date"];
14 | break;
15 | case "q":
16 | default:
17 | targets = ["title", "tags", "author", "url", "date", "content"];
18 | break;
19 | }
20 | showPosts(query.words, targets);
21 |
22 | if (query.key == "q") {
23 | $("#search").val(query.query).focus();
24 | }
25 | });
26 |
27 | function getQuery(keys)
28 | {
29 | var query = "";
30 | var key = "";
31 | var words = [];
32 |
33 | keys.forEach(function (queryKey) {
34 | var regex = RegExp("[?&]" + queryKey + "=([^&]+)", 'i');
35 | var matched;
36 | if (matched = window.location.search.match(regex)) {
37 | query = decodeURIComponent(matched[1]).replace(/( | )+/g, ' ');
38 | words = query.split(' ');
39 | key = queryKey;
40 | return false; // break;
41 | }
42 | return true; // continue;
43 | });
44 |
45 | return { query: query, key: key, words: words };
46 | }
47 |
48 | function showPosts(words, targets)
49 | {
50 | var getJson = function () {
51 |
52 | var dfd = $.Deferred();
53 | $.ajax({
54 | url: baseurl + "/search.json",
55 | dataType: "json",
56 | timeout: 3000, // 3 sec
57 | success: function (posts) {
58 | var matchedPosts = [];
59 | posts.forEach(function (post) {
60 |
61 | // concatenate target fields as a string.
62 | var searchee = "";
63 | for (var i = 0; i < targets.length; i++) {
64 | var target = post[targets[i]];
65 | var targetString = "";
66 | if (target instanceof Array) {
67 | for (var j = 0; j < target.length; j++) {
68 | targetString += target[j];
69 | }
70 | } else if (typeof target == "object") {
71 | for (key in target) {
72 | targetString += target[key];
73 | }
74 | } else {
75 | targetString = target;
76 | }
77 | searchee += targetString;
78 | }
79 |
80 | // matching.
81 | var matched = false;
82 | words.forEach(function (word) {
83 | var regex = new RegExp(word, 'i');
84 | if (searchee.match(regex) != null) {
85 | matched = true;
86 | return false; // break;
87 | }
88 | return true; // continue;
89 | });
90 |
91 | if (matched) {
92 | matchedPosts.push(post);
93 | }
94 | });
95 |
96 | dfd.resolve(matchedPosts);
97 | }
98 | });
99 |
100 | return dfd.promise();
101 | };
102 |
103 | getJson().then(function (matchedPosts) {
104 | matchedPosts.forEach(function (post) {
105 | $("#search-results").find("#" + post.id).show();
106 | });
107 | });
108 | }
109 |
--------------------------------------------------------------------------------
/assets/lib/garand-sticky/jquery.sticky.js:
--------------------------------------------------------------------------------
1 | // Sticky Plugin v1.0.0 for jQuery
2 | // =============
3 | // Author: Anthony Garand
4 | // Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
5 | // Improvements by Leonardo C. Daronco (daronco)
6 | // Created: 2/14/2011
7 | // Date: 2/12/2012
8 | // Website: http://labs.anthonygarand.com/sticky
9 | // Description: Makes an element on the page stick on the screen as you scroll
10 | // It will only set the 'top' and 'position' of your element, you
11 | // might need to adjust the width in some cases.
12 |
13 | (function($) {
14 | var defaults = {
15 | topSpacing: 0,
16 | bottomSpacing: 0,
17 | className: 'is-sticky',
18 | wrapperClassName: 'sticky-wrapper',
19 | center: false,
20 | getWidthFrom: '',
21 | responsiveWidth: false
22 | },
23 | $window = $(window),
24 | $document = $(document),
25 | sticked = [],
26 | windowHeight = $window.height(),
27 | scroller = function() {
28 | var scrollTop = $window.scrollTop(),
29 | documentHeight = $document.height(),
30 | dwh = documentHeight - windowHeight,
31 | extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
32 |
33 | for (var i = 0; i < sticked.length; i++) {
34 | var s = sticked[i],
35 | elementTop = s.stickyWrapper.offset().top,
36 | etse = elementTop - s.topSpacing - extra;
37 |
38 | if (scrollTop <= etse) {
39 | if (s.currentTop !== null) {
40 | s.stickyElement
41 | .css('width', '')
42 | .css('position', '')
43 | .css('top', '');
44 | s.stickyElement.trigger('sticky-end', [s]).parent().removeClass(s.className);
45 | s.currentTop = null;
46 | }
47 | }
48 | else {
49 | var newTop = documentHeight - s.stickyElement.outerHeight()
50 | - s.topSpacing - s.bottomSpacing - scrollTop - extra;
51 | if (newTop < 0) {
52 | newTop = newTop + s.topSpacing;
53 | } else {
54 | newTop = s.topSpacing;
55 | }
56 | if (s.currentTop != newTop) {
57 | s.stickyElement
58 | .css('width', s.stickyElement.width())
59 | .css('position', 'fixed')
60 | .css('top', newTop);
61 |
62 | if (typeof s.getWidthFrom !== 'undefined') {
63 | s.stickyElement.css('width', $(s.getWidthFrom).width());
64 | }
65 |
66 | s.stickyElement.trigger('sticky-start', [s]).parent().addClass(s.className);
67 | s.currentTop = newTop;
68 | }
69 | }
70 | }
71 | },
72 | resizer = function() {
73 | windowHeight = $window.height();
74 |
75 | for (var i = 0; i < sticked.length; i++) {
76 | var s = sticked[i];
77 | if (typeof s.getWidthFrom !== 'undefined' && s.responsiveWidth === true) {
78 | s.stickyElement.css('width', $(s.getWidthFrom).width());
79 | }
80 | }
81 | },
82 | methods = {
83 | init: function(options) {
84 | var o = $.extend({}, defaults, options);
85 | return this.each(function() {
86 | var stickyElement = $(this);
87 |
88 | var stickyId = stickyElement.attr('id');
89 | var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName
90 | var wrapper = $('
')
91 | .attr('id', stickyId + '-sticky-wrapper')
92 | .addClass(o.wrapperClassName);
93 | stickyElement.wrapAll(wrapper);
94 |
95 | if (o.center) {
96 | stickyElement.parent().css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
97 | }
98 |
99 | if (stickyElement.css("float") == "right") {
100 | stickyElement.css({"float":"none"}).parent().css({"float":"right"});
101 | }
102 |
103 | var stickyWrapper = stickyElement.parent();
104 | stickyWrapper.css('height', stickyElement.outerHeight());
105 | sticked.push({
106 | topSpacing: o.topSpacing,
107 | bottomSpacing: o.bottomSpacing,
108 | stickyElement: stickyElement,
109 | currentTop: null,
110 | stickyWrapper: stickyWrapper,
111 | className: o.className,
112 | getWidthFrom: o.getWidthFrom,
113 | responsiveWidth: o.responsiveWidth
114 | });
115 | });
116 | },
117 | update: scroller,
118 | unstick: function(options) {
119 | return this.each(function() {
120 | var unstickyElement = $(this);
121 |
122 | var removeIdx = -1;
123 | for (var i = 0; i < sticked.length; i++)
124 | {
125 | if (sticked[i].stickyElement.get(0) == unstickyElement.get(0))
126 | {
127 | removeIdx = i;
128 | }
129 | }
130 | if(removeIdx != -1)
131 | {
132 | sticked.splice(removeIdx,1);
133 | unstickyElement.unwrap();
134 | unstickyElement.removeAttr('style');
135 | }
136 | });
137 | }
138 | };
139 |
140 | // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
141 | if (window.addEventListener) {
142 | window.addEventListener('scroll', scroller, false);
143 | window.addEventListener('resize', resizer, false);
144 | } else if (window.attachEvent) {
145 | window.attachEvent('onscroll', scroller);
146 | window.attachEvent('onresize', resizer);
147 | }
148 |
149 | $.fn.sticky = function(method) {
150 | if (methods[method]) {
151 | return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
152 | } else if (typeof method === 'object' || !method ) {
153 | return methods.init.apply( this, arguments );
154 | } else {
155 | $.error('Method ' + method + ' does not exist on jQuery.sticky');
156 | }
157 | };
158 |
159 | $.fn.unstick = function(method) {
160 | if (methods[method]) {
161 | return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
162 | } else if (typeof method === 'object' || !method ) {
163 | return methods.unstick.apply( this, arguments );
164 | } else {
165 | $.error('Method ' + method + ' does not exist on jQuery.sticky');
166 | }
167 |
168 | };
169 | $(function() {
170 | setTimeout(scroller, 0);
171 | });
172 | })(jQuery);
173 |
--------------------------------------------------------------------------------
/browserconfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | #da532c
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/favicon-16x16.png
--------------------------------------------------------------------------------
/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/favicon-32x32.png
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/favicon.ico
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/icon.png
--------------------------------------------------------------------------------
/images/arc42ByExample-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/arc42ByExample-small.png
--------------------------------------------------------------------------------
/images/contact-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/contact-icon.png
--------------------------------------------------------------------------------
/images/faq-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/faq-icon.png
--------------------------------------------------------------------------------
/images/patterns/FileTransferIcon.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/FileTransferIcon.gif
--------------------------------------------------------------------------------
/images/patterns/MessagingIcon.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/MessagingIcon.gif
--------------------------------------------------------------------------------
/images/patterns/adapter.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/adapter.jpg
--------------------------------------------------------------------------------
/images/patterns/batch-sequential.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-03-30 09:05:38 +0000 6-3-BatchSeq Ebene 1 Legend validate receive optimize sort report Data- transformation data flow
4 |
--------------------------------------------------------------------------------
/images/patterns/broker.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-04-07 06:16:49 +0000 6-Broker Ebene 1 Legend call, invocation Broker Client (generated) Stub Service (generated) Skeleton Broker network
4 |
--------------------------------------------------------------------------------
/images/patterns/data-centric.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-03-30 11:03:12 +0000 6-5-Datenzentriert Ebene 1 Legend Data flow «active» functional unit 2 «passive» Shared Repository «active» functional unit 1 User Control flow «active» Supervisor / Bootstrap
4 |
--------------------------------------------------------------------------------
/images/patterns/facade.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/facade.png
--------------------------------------------------------------------------------
/images/patterns/hexagonal.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-03-30 12:23:06 +0000 Arbeitsfläche 18 Ebene 1 Legend call Application user DB Other System Adapter Adapter Adapter
4 |
--------------------------------------------------------------------------------
/images/patterns/layers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/layers.png
--------------------------------------------------------------------------------
/images/patterns/master-slave.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-03-30 11:19:34 +0000 6-7-MasterSlave-Schema Ebene 1 Legend Master control flow , call Slave 2 Slave 1 Slave n
4 |
--------------------------------------------------------------------------------
/images/patterns/mvc-pattern.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/mvc-pattern.png
--------------------------------------------------------------------------------
/images/patterns/pipes-and-filter.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-03-30 09:08:53 +0000 6-4-PipesFilter Ebene 1 Legend Data processing, «fi lter» data flow , «pipe» «data source» image sensor «fi lter» Color correction «fi lter» Image ef fects «fi lter» Compression «data sink» Storage Examples: Sepia, B/W , Rotation add EXIF data «fi lter» EXIF-Supply «pipe» «pipe» «pipe»
4 |
--------------------------------------------------------------------------------
/images/patterns/proxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/images/patterns/proxy.png
--------------------------------------------------------------------------------
/images/patterns/unix.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 | Produced by OmniGraffle 6.6.2 2017-03-30 11:20:06 +0000 6-6-Aufbau-Unix Ebene 1 User and Programs
4 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: index_default
3 | ---
4 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "",
3 | "icons": [
4 | {
5 | "src": "\/android-chrome-192x192.png",
6 | "sizes": "192x192",
7 | "type": "image\/png"
8 | },
9 | {
10 | "src": "\/android-chrome-512x512.png",
11 | "sizes": "512x512",
12 | "type": "image\/png"
13 | }
14 | ],
15 | "theme_color": "#ffffff",
16 | "display": "standalone"
17 | }
18 |
--------------------------------------------------------------------------------
/mstile-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/mstile-144x144.png
--------------------------------------------------------------------------------
/mstile-150x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/mstile-150x150.png
--------------------------------------------------------------------------------
/mstile-310x150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/mstile-310x150.png
--------------------------------------------------------------------------------
/mstile-310x310.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/mstile-310x310.png
--------------------------------------------------------------------------------
/mstile-70x70.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/mstile-70x70.png
--------------------------------------------------------------------------------
/originals/Architecture-Patterns-EN.graffle/image2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/originals/Architecture-Patterns-EN.graffle/image2.gif
--------------------------------------------------------------------------------
/originals/Architecture-Patterns-EN.graffle/image4.tiff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/originals/Architecture-Patterns-EN.graffle/image4.tiff
--------------------------------------------------------------------------------
/originals/logo/patterns-42-logo.graffle:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ApplicationVersion
6 |
7 | com.omnigroup.OmniGraffle7
8 | 181.4.0.297378
9 |
10 | CreationDate
11 | 2014-07-20 14:59:03 +0000
12 | Creator
13 | Dr. Gernot Starke
14 | FileType
15 | flat
16 | GraphDocumentVersion
17 | 14
18 | GuidesLocked
19 | NO
20 | GuidesVisible
21 | YES
22 | ImageCounter
23 | 4
24 | LinksVisible
25 | NO
26 | MagnetsVisible
27 | NO
28 | MasterSheets
29 |
30 | ModificationDate
31 | 2017-10-28 08:28:57 +0000
32 | Modifier
33 | Dr. Gernot Starke
34 | MovementHandleVisible
35 | NO
36 | NotesVisible
37 | NO
38 | OriginVisible
39 | NO
40 | PageBreaks
41 | NO
42 | PrintInfo
43 |
44 | NSBottomMargin
45 |
46 | float
47 | 41
48 |
49 | NSHorizonalPagination
50 |
51 | coded
52 | BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
53 |
54 | NSLeftMargin
55 |
56 | float
57 | 18
58 |
59 | NSPaperSize
60 |
61 | size
62 | {595, 842}
63 |
64 | NSPrintReverseOrientation
65 |
66 | coded
67 | BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG
68 |
69 | NSRightMargin
70 |
71 | float
72 | 18
73 |
74 | NSTopMargin
75 |
76 | float
77 | 18
78 |
79 |
80 | ReadOnly
81 | NO
82 | Sheets
83 |
84 |
85 | ActiveLayerIndex
86 | 0
87 | AutoAdjust
88 | 6
89 | AutosizingMargin
90 | 72
91 | BackgroundGraphic
92 |
93 | Bounds
94 | {{0, 0}, {264.4375, 209.9375}}
95 | Class
96 | GraffleShapes.CanvasBackgroundGraphic
97 | ID
98 | 2
99 | Style
100 |
101 | shadow
102 |
103 | Draws
104 | NO
105 |
106 | stroke
107 |
108 | Draws
109 | NO
110 |
111 |
112 |
113 | BaseZoom
114 | 0
115 | CanvasDimensionsOrigin
116 | {0, 0}
117 | CanvasOrigin
118 | {0, 0}
119 | CanvasSize
120 | {264.4375, 209.9375}
121 | CanvasSizingMode
122 | 1
123 | ColumnAlign
124 | 1
125 | ColumnSpacing
126 | 36
127 | DisplayScale
128 | 1 in = 1 in
129 | GraphicsList
130 |
131 |
132 | Bounds
133 | {{151.875, 83.25}, {39.5625, 40}}
134 | Class
135 | ShapedGraphic
136 | FitText
137 | Vertical
138 | Flow
139 | Resize
140 | FontInfo
141 |
142 | Color
143 |
144 | b
145 | 0
146 | g
147 | 0
148 | r
149 | 1
150 |
151 | Font
152 | Frutiger-Cn
153 | Size
154 | 27
155 |
156 | ID
157 | 3
158 | Style
159 |
160 | fill
161 |
162 | Draws
163 | NO
164 |
165 | shadow
166 |
167 | Draws
168 | NO
169 |
170 | stroke
171 |
172 | Draws
173 | NO
174 |
175 |
176 | Text
177 |
178 | Pad
179 | 1
180 | RTFD
181 |
182 | BAtzdHJlYW10eXBlZIHoA4QBQISE
183 | hBJOU0F0dHJpYnV0ZWRTdHJpbmcA
184 | hIQITlNPYmplY3QAhZKEhIQITlNT
185 | dHJpbmcBlIQBKwI0MoaEAmlJAQKS
186 | hISEDE5TRGljdGlvbmFyeQCUhAFp
187 | BJKElpYQTlNQYXJhZ3JhcGhTdHls
188 | ZYaShISEF05TTXV0YWJsZVBhcmFn
189 | cmFwaFN0eWxlAISEEE5TUGFyYWdy
190 | YXBoU3R5bGUAlIQEQ0NAUwIAhISE
191 | B05TQXJyYXkAlJkAhoEAAoQEWzFm
192 | XSSGkoSWlgdOU0NvbG9yhpKEhIQH
193 | TlNDb2xvcgCUhAFjAYQEZmZmZgEA
194 | AAGGkoSWlgZOU0ZvbnSGkoSEhAZO
195 | U0ZvbnQelJkghAVbMzJjXQYAAAAY
196 | AAAA//5GAHIAdQB0AGkAZwBlAHIA
197 | LQBDAG4AhAFmG6AAoAGgAKAAhpKE
198 | lpYGTlNLZXJuhpKEhIQITlNOdW1i
199 | ZXIAhIQHTlNWYWx1ZQCUhAEqhIQB
200 | ZKgAhoaG
201 |
202 | Text
203 | {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
204 | {\fonttbl\f0\fnil\fcharset0 Frutiger-Cn;}
205 | {\colortbl;\red255\green255\blue255;\red255\green0\blue0;}
206 | {\*\expandedcolortbl;;\csgenericrgb\c100000\c0\c0;}
207 | \deftab720
208 | \pard\pardeftab720\qc\partightenfactor0
209 |
210 | \f0\fs54 \cf2 \expnd0\expndtw0\kerning0
211 | 42}
212 | VerticalPad
213 | 2
214 |
215 |
216 |
217 | Bounds
218 | {{118.4375, 3.9375}, {60, 134}}
219 | Class
220 | ShapedGraphic
221 | FitText
222 | YES
223 | Flow
224 | Resize
225 | FontInfo
226 |
227 | Color
228 |
229 | b
230 | 0.798753
231 | g
232 | 0.465158
233 | r
234 | 0.26247
235 | space
236 | srgb
237 |
238 | Font
239 | Frutiger-Bold
240 | Size
241 | 103
242 |
243 | ID
244 | 4
245 | Style
246 |
247 | fill
248 |
249 | Draws
250 | NO
251 |
252 | shadow
253 |
254 | Draws
255 | NO
256 |
257 | stroke
258 |
259 | Draws
260 | NO
261 |
262 |
263 | Text
264 |
265 | Pad
266 | 1
267 | Text
268 | {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf830
269 | {\fonttbl\f0\fnil\fcharset0 Frutiger-Bold;}
270 | {\colortbl;\red255\green255\blue255;\red53\green96\blue192;}
271 | {\*\expandedcolortbl;;\cssrgb\c26247\c46516\c79875;}
272 | \deftab720
273 | \pard\pardeftab720\qc\partightenfactor0
274 |
275 | \f0\b\fs206 \cf2 P}
276 | VerticalPad
277 | 0.0
278 |
279 | Wrap
280 | NO
281 |
282 |
283 | Bounds
284 | {{151.875, 86.625}, {39.5625, 39.5625}}
285 | Class
286 | ShapedGraphic
287 | ID
288 | 5
289 | Shape
290 | Circle
291 | Style
292 |
293 | shadow
294 |
295 | Draws
296 | NO
297 |
298 | stroke
299 |
300 | Color
301 |
302 | b
303 | 0.0
304 | g
305 | 0.1491314172744751
306 | r
307 | 1
308 | space
309 | srgb
310 |
311 | Width
312 | 2
313 |
314 |
315 | Text
316 |
317 | VerticalPad
318 | 0.0
319 |
320 |
321 |
322 | GridInfo
323 |
324 | HPages
325 | 1
326 | KeepToScale
327 |
328 | Layers
329 |
330 |
331 | Artboards
332 |
333 | Lock
334 |
335 | Name
336 | Ebene 1
337 | Print
338 |
339 | View
340 |
341 |
342 |
343 | LayoutInfo
344 |
345 | Animate
346 | NO
347 | LineLength
348 | 0.4643835723400116
349 | circoMinDist
350 | 18
351 | circoSeparation
352 | 0.0
353 | layoutEngine
354 | dot
355 | neatoLineLength
356 | 0.20000000298023224
357 | neatoSeparation
358 | 0.0
359 | twopiSeparation
360 | 0.0
361 |
362 | Orientation
363 | 2
364 | OutlineStyle
365 | Basic
366 | PrintOnePage
367 |
368 | RowAlign
369 | 1
370 | RowSpacing
371 | 36
372 | SheetTitle
373 | Arbeitsfläche 1
374 | UniqueID
375 | 1
376 | VPages
377 | 1
378 | VisibleVoidKey
379 | 1
380 |
381 |
382 | SmartAlignmentGuidesActive
383 | YES
384 | SmartDistanceGuidesActive
385 | YES
386 | UseEntirePage
387 |
388 | WindowInfo
389 |
390 | CurrentSheet
391 | 0
392 | Frame
393 | {{4, 51}, {1276, 729}}
394 | ShowInfo
395 |
396 | Sidebar
397 |
398 | SidebarWidth
399 | 200
400 | Sidebar_Tab
401 | 0
402 | VisibleRegion
403 | {{-196.66666666666666, -127.33333333333333}, {1032, 825.33333333333337}}
404 | ZoomValues
405 |
406 |
407 | Arbeitsfläche 1
408 | 0.75
409 | 1
410 |
411 |
412 |
413 | compressOnDiskKey
414 |
415 | copyLinkedImagesKey
416 |
417 | createSinglePDFKey
418 |
419 | exportAreaKey
420 | 2
421 | exportQualityKey
422 | 100
423 | exportSizesKey
424 |
425 | 1
426 | png
427 |
428 | fileFormatKey
429 | 0
430 | htmlImageTypeKey
431 | 0
432 | includeBackgroundGraphicKey
433 |
434 | includeNonPrintingLayersKey
435 |
436 | lastExportTypeKey
437 | 0
438 | marginWidthKey
439 | 0.0
440 | previewTypeKey
441 | 0
442 | readOnlyKey
443 |
444 | resolutionForBMPKey
445 | 1
446 | resolutionForGIFKey
447 | 1
448 | resolutionForHTMLKey
449 | 1
450 | resolutionForJPGKey
451 | 1
452 | resolutionForPNGKey
453 | 4.1666665077209473
454 | resolutionForTIFFKey
455 | 1
456 | resolutionUnitsKey
457 | 0
458 | saveAsFlatFileOptionKey
459 | 0
460 | useArtboardsKey
461 |
462 | useMarginKey
463 |
464 | useNotesKey
465 |
466 |
467 |
468 |
--------------------------------------------------------------------------------
/originals/logo/patterns-42-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/arc42/patterns.arc42.org-site/803daa705c5546cb63c8987039a4c89ef5f40356/originals/logo/patterns-42-logo.png
--------------------------------------------------------------------------------
/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 | Created by potrace 1.11, written by Peter Selinger 2001-2013
9 |
10 |
12 |
32 |
40 |
47 |
52 |
64 |
71 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/search.json:
--------------------------------------------------------------------------------
1 | ---
2 | ---
3 |
4 | [
5 | {% for post in site.posts %}
6 | {
7 | "id": {{ post.id | replace: '/', '-' | jsonify }},
8 | "title": {{ post.title | jsonify }},
9 | "author": {{ post.author | jsonify }},
10 | "tags": [{% for tag in post.tags%}{{ tag | jsonify }}{% unless forloop.last %}, {% endunless %}{% endfor %}],
11 | "url": {{ post.url | jsonify }},
12 | "date": {{ post.date | date: '%Y-%m-%d' | jsonify }},
13 | "content": {{ post.content | strip_html | strip_newlines | jsonify }}
14 | }{% unless forloop.last %}, {% endunless %}
15 | {% endfor %}
16 | ]
17 |
--------------------------------------------------------------------------------