├── .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 | ![](https://i.creativecommons.org/l/by-sa/4.0/88x31.png) 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 | 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 |
26 |
    27 | 28 | {% if page.author %} 29 |
  • 30 | 31 | 32 | {{ page.author }} 33 | 34 |
  • 35 | 36 | {% if page.icons %} 37 |
  • 38 |
      39 | {% include icons.html icons=page.icons %} 40 |
    41 |
  • 42 | {% endif %} 43 | {% endif %} 44 | 45 |
46 |
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 |
    6 |
    7 |
    8 | {{ content }} 9 |
    10 |
    11 |
    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 | 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 |
    9 | {{ content }} 10 |
    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 |
    9 | {{ content }} 10 |
    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 |
    49 | 59 |
    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 |
    17 | 28 | 29 | {% for item in (0..site.tags.size) %}{% unless forloop.last %} 30 | {% capture this_word %}{{ tag_words[item] | strip_newlines }}{% endcapture %} 31 |

    {{ this_word }}

    32 | 38 | {% endunless %}{% endfor %} 39 |
    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 | 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 | ![](/images/patterns/master-slave.svg) 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 | ![](/images/patterns/hexagonal.svg) 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 | ![](/images/patterns/batch-sequential.svg) 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 | ![](/images/patterns/pipes-and-filter.svg) 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 | ![](/images/patterns/data-centric.svg) 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 | ![Figure: MVC](/images/patterns/mvc-pattern.png) 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 | ![](/images/patterns/FileTransferIcon.gif) 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 | ![](/images/patterns/MessagingIcon.gif){: .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 | ![](/images/patterns/broker.svg) 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 | ![Real-World Adapter](/images/patterns/adapter.jpg){: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 | ![Real-World Facade](/images/patterns/facade.png){: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 | ![Proxy](/images/patterns/proxy.png) 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 +00006-3-BatchSeqEbene 1Legend validatereceive optimizesortreportData-transformationdata flow 4 | -------------------------------------------------------------------------------- /images/patterns/broker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Produced by OmniGraffle 6.6.2 2017-04-07 06:16:49 +0000 6-BrokerEbene 1Legend call, invocationBrokerClient(generated)StubService(generated)SkeletonBrokernetwork 4 | -------------------------------------------------------------------------------- /images/patterns/data-centric.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Produced by OmniGraffle 6.6.2 2017-03-30 11:03:12 +0000 6-5-DatenzentriertEbene 1Legend Data flow«active»functionalunit 2«passive»Shared Repository«active»functionalunit 1UserControl 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 +0000Arbeitsfläche 18Ebene 1Legend callApplicationuserDBOtherSystemAdapterAdapterAdapter 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 +00006-7-MasterSlave-SchemaEbene 1Legend Mastercontrol flow, callSlave 2Slave 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-PipesFilterEbene 1Legend Data processing,«filter»data flow,«pipe»«data source»image sensor«filter»Color correction«filter»Image effects«filter»Compression«data sink»StorageExamples: Sepia, B/W,Rotationadd EXIF data«filter»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 +00006-6-Aufbau-UnixEbene 1User 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 | --------------------------------------------------------------------------------