content/en/who.md 0000644 0001750 0005670 00000000262 15264202076 012502 0 ustar 00 0000000 0000000 Who should read this document?
==============================
Any developer building applications which run as a service. Ops engineers who deploy or manage such applications.
content/ja/build-release-run.md 0000644 0001750 0005670 00000007007 15264202076 015220 0 ustar 00 0000000 0000000 ## V. ビルド�リリース�実行
### ビルド�リリース�実行�3��ステージを厳密�分離�る
[コードベース](./codebase)ã�¯3ã�¤ã�®ã‚¹ãƒ†ãƒ¼ã‚¸ã‚’経ã�¦ã€�(開発環境ã�§ã�¯ã�ªã�„)デプãƒã‚¤ã�¸ã�¨å¤‰æ�›ã�•れる。
* *ビルドステージ* ã�¯ã€�コードリãƒ�ジトリを *ビルド* ã�¨å‘¼ã�°ã‚Œã‚‹å®Ÿè¡Œå�¯èƒ½ã�ªå¡Šã�¸ã�¨å¤‰ã�ˆã‚‹å¤‰æ�›ã�§ã�‚る。デプãƒã‚¤ãƒ—ãƒã‚»ã‚¹ã�§æŒ‡å®šã�—ã�Ÿã‚³ãƒŸãƒƒãƒˆã�®ã‚³ãƒ¼ãƒ‰ã�§æŒ‡å®šã�•れã�Ÿãƒ�ージョンを使ã�£ã�¦ã€�ビルドステージã�¯[ä¾�å˜é–¢ä¿‚](./dependencies)ã‚’å�–å¾—ã�—ã�¦ãƒãƒ¼ã‚«ãƒ«ç’°å¢ƒã�«é…�ç½®ã�—ã€�ãƒ�イナリやアセットファイルをコンパイルã�™ã‚‹ã€‚
* *リリースステージ* ã�¯ã€�ビルドステージã�§ç”Ÿæˆ�ã�•れã�Ÿãƒ“ルドをå�—ã�‘å�–りã€�ã��れをデプãƒã‚¤ã�®ç�¾åœ¨ã�®[è¨å®š](./config)ã�¨çµ�å�ˆã�™ã‚‹ã€‚出æ�¥ä¸Šã�Œã‚‹ *リリース* ã�«ã�¯ãƒ“ルドã�¨è¨å®šã�®ä¸¡æ–¹ã�Œå�«ã�¾ã‚Œã€�実行環境ã�®ä¸ã�§ã�™ã��ã�«ã�§ã‚‚実行ã�§ã��るよã�†æº–å‚™ã�Œæ•´ã�†ã€‚
* *実行ステージ* (ランタイムã�¨ã‚‚呼ã�°ã‚Œã‚‹ï¼‰ã�¯ã€�é�¸æŠžã�•れã�Ÿãƒªãƒªãƒ¼ã‚¹ã�«å¯¾ã�—ã�¦ã€�アプリケーションã�®ã�„ã��ã�¤ã�‹ã�®[プãƒã‚»ã‚¹](./processes)ã‚’èµ·å‹•ã�™ã‚‹ã�“ã�¨ã�§ã€�アプリケーションを実行環境ã�®ä¸ã�§å®Ÿè¡Œã�™ã‚‹ã€‚

**Twelve-Factor Appã�¯ã€�ビルドã€�リリースã€�実行ã�®3ã�¤ã�®ã‚¹ãƒ†ãƒ¼ã‚¸ã‚’厳密ã�«åˆ†é›¢ã�™ã‚‹ã€‚** 例ã�ˆã�°ã€�実行ステージã�«ã�‚るコードを変更ã�—ã�¦ã‚‚ã��ã�®å¤‰æ›´ã‚’ビルドステージã�«ä¼�ã�ˆã‚‹æ–¹æ³•ã�Œã�ªã�„ã�Ÿã‚�ã€�コードを実行ä¸ã�«å¤‰æ›´ã�™ã‚‹ã�“ã�¨ã�¯ã�‚り得ã�ªã�„。
デプãƒã‚¤ãƒ„ールã�¯é€šå¸¸ã€�リリース管ç�†ãƒ„ールをæ��ä¾›ã�™ã‚‹ã€‚ä¸ã�§ã‚‚注目ã�™ã�¹ã��ã�¯ã€�以å‰�ã�®ãƒªãƒªãƒ¼ã‚¹ã�«ãƒãƒ¼ãƒ«ãƒ�ックã�™ã‚‹æ©Ÿèƒ½ã�§ã�‚る。例ã�ˆã�°ãƒ‡ãƒ—ãƒã‚¤ãƒ„ールã�®[Capistrano](https://github.com/capistrano/capistrano/wiki)ã�¯ã€�リリースを`releases`ã�¨ã�„ã�†å��å‰�ã�®ã‚µãƒ–ディレクトリã�«æ ¼ç´�ã�—ã€�ç�¾åœ¨ã�®ãƒªãƒªãƒ¼ã‚¹ã�¯ç�¾åœ¨ã�®ãƒªãƒªãƒ¼ã‚¹ã�®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã�¸ã�®ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã�¨ã�ªã‚‹ã€‚Capistranoã�®`rollback`コマンドを使ã�†ã�¨ã€�ç°¡å�˜ã�‹ã�¤å�³åº§ã�«ä»¥å‰�ã�®ãƒªãƒªãƒ¼ã‚¹ã�«ãƒãƒ¼ãƒ«ãƒ�ックã�§ã��る。
ã�™ã�¹ã�¦ã�®ãƒªãƒªãƒ¼ã‚¹ã�¯å¸¸ã�«ä¸€æ„�ã�®ãƒªãƒªãƒ¼ã‚¹IDã‚’æŒ�ã�¤ã�¹ã��ã�§ã�‚る。リリースIDã�®ä¾‹ã�¨ã�—ã�¦ã�¯ã€�リリースã�®ã‚¿ã‚¤ãƒ スタンプ(例:`2011-04-06-20:32:17`)や連番(例:`v100`)ã�Œã�‚る。リリースã�¯è¿½è¨˜å°‚用ã�®å�°å¸³ã�§ã�‚りã€�一度作られã�Ÿãƒªãƒªãƒ¼ã‚¹ã�¯å¤‰æ›´ã�™ã‚‹ã�“ã�¨ã�Œã�§ã��ã�ªã�„。変更ã�™ã‚‹å ´å�ˆã�¯æ–°ã�—ã�„リリースを作らã�ªã�‘れã�°ã�ªã‚‰ã�ªã�„。
ビルドステージã�¯ã€�æ–°ã�—ã�„コードã�Œãƒ‡ãƒ—ãƒã‚¤ã�•れるã�¨ã��ã�«å¿…ã�šã‚¢ãƒ—リケーションã�®é–‹ç™ºè€…ã�«ã‚ˆã�£ã�¦é–‹å§‹ã�•れる。一方実行ステージã�¯ã€�サーãƒ�ーã�®å†�起動時やã€�クラッシュã�—ã�Ÿãƒ—ãƒã‚»ã‚¹ã�Œãƒ—ãƒã‚»ã‚¹ãƒžãƒ�ージャーã�«ã‚ˆã�£ã�¦å†�èµ·å‹•ã�•れã�Ÿæ™‚ã�«è‡ªå‹•ã�§é–‹å§‹ã�•れる。ã�“ã�®ã�Ÿã‚�ã€�実行ステージã�¯ã�§ã��ã‚‹ã� ã�‘å�¯å¤‰éƒ¨åˆ†ã‚’æŒ�ã�Ÿã�ªã�„よã�†ã�«ã�™ã‚‹ã�¹ã��ã�§ã�‚る。ã�ªã�œã�ªã‚‰ã€�アプリケーションã�®å®Ÿè¡Œã‚’妨ã�’るよã�†ã�ªå•�題ã�Œèµ·ã��ã‚‹ã�¨ã€�開発者ã�Œå¾…機ã�—ã�¦ã�„ã�ªã�„真夜ä¸ã�«ã‚¢ãƒ—リケーションã�Œå£Šã‚Œã‚‹çµ�æžœã�«ã�ªã‚‹ã�Ÿã‚�ã�§ã�‚る。ビルドステージã�¯ã‚‚ã�£ã�¨è¤‡é›‘ã�§ã‚‚æ§‹ã‚�ã�ªã�„。ã�ªã�œã�ªã‚‰ã€�ビルドステージã�®ã‚¨ãƒ©ãƒ¼ã�¯å¸¸ã�«ãƒ‡ãƒ—ãƒã‚¤ã‚’実行ã�—ã�¦ã�„る開発者ã�®ç›®ã�®å‰�ã�§ç™ºç”Ÿã�™ã‚‹ã�Ÿã‚�ã�§ã�‚る。
content/ja/toc.md 0000644 0001750 0005670 00000002712 15264202076 012464 0 ustar 00 0000000 0000000 The Twelve Factors
==================
## [I. コードベース](./codebase)
### ãƒ�ージョン管ç�†ã�•れã�¦ã�„ã‚‹1ã�¤ã�®ã‚³ãƒ¼ãƒ‰ãƒ™ãƒ¼ã‚¹ã�¨è¤‡æ•°ã�®ãƒ‡ãƒ—ãƒã‚¤
## [II. ä¾�å˜é–¢ä¿‚](./dependencies)
### ä¾�å˜é–¢ä¿‚を明示的ã�«å®£è¨€ã�—分離ã�™ã‚‹
## [III. è¨å®š](./config)
### è¨å®šã‚’環境変数ã�«æ ¼ç´�ã�™ã‚‹
## [IV. �ックエンドサービス](./backing-services)
### �ックエンドサービスをアタッ��れ�リソース���扱�
## [V. ビルド�リリース�実行](./build-release-run)
### ビルド�リリース�実行�3��ステージを厳密�分離�る
## [VI. プãƒã‚»ã‚¹](./processes)
### アプリケーションを1ã�¤ã‚‚ã�—ã��ã�¯è¤‡æ•°ã�®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¬ã‚¹ã�ªãƒ—ãƒã‚»ã‚¹ã�¨ã�—ã�¦å®Ÿè¡Œã�™ã‚‹
## [VII. �ート�インディング](./port-binding)
### �ート�インディングを通��サービスを公開�る
## [VIII. 並行性](./concurrency)
### プãƒã‚»ã‚¹ãƒ¢ãƒ‡ãƒ«ã�«ã‚ˆã�£ã�¦ã‚¹ã‚±ãƒ¼ãƒ«ã‚¢ã‚¦ãƒˆã�™ã‚‹
## [IX. 廃棄容易性](./disposability)
### 高速ã�ªèµ·å‹•ã�¨ã‚°ãƒ¬ãƒ¼ã‚¹ãƒ•ルシャットダウンã�§å …牢性を最大化ã�™ã‚‹
## [X. 開発/本番一致](./dev-prod-parity)
### 開発ã€�ステージングã€�本番環境をã�§ã��ã‚‹ã� ã�‘一致ã�•ã�›ã�ŸçŠ¶æ…‹ã‚’ä¿�ã�¤
## [XI. ãƒã‚°](./logs)
### ãƒã‚°ã‚’イベントストリームã�¨ã�—ã�¦æ‰±ã�†
## [XII. 管ç�†ãƒ—ãƒã‚»ã‚¹](./admin-processes)
### 管ç�†ã‚¿ã‚¹ã‚¯ã‚’1回é™�りã�®ãƒ—ãƒã‚»ã‚¹ã�¨ã�—ã�¦å®Ÿè¡Œã�™ã‚‹
content/th/port-binding.md 0000644 0001750 0005670 00000005463 15264202076 014322 0 ustar 00 0000000 0000000 ## VII. Port binding
### นำà¸à¸à¸�บริà¸�ารด้วยà¸�ารเชื่à¸à¸¡à¹‚ยง port
เว็บà¹�à¸à¸ž (Web App) บางครั้งทำงานข้างใน webserver container. ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™ PHP app จะทำงานเป็นโมดูลข้างใน [Apache HTTPD](http://httpd.apache.org/) หรืภJava app จะทำงานข้างใน [Tomcat](http://tomcat.apache.org/) เป็นต้น
**Twelve-factor app เป็น self-contained โดยสมบูรณ์** à¹�ละไม่ขึ้นà¸à¸¢à¸¹à¹ˆà¸�ับ runtime injection ขà¸à¸‡ webserver เข้ามายังสภาพà¹�วดล้à¸à¸¡à¸�ารดำเนินงานเพิ่à¸à¸ªà¸£à¹‰à¸²à¸‡ web-facing service. เว็บà¹�à¸à¸ž **นำà¸à¸à¸� HTTP เป็นบริà¸�ารโดยเชื่à¸à¸¡à¹‚ยงà¸�ับ port** à¹�ละคà¸à¸¢à¸•รวจสà¸à¸š request ที่เข้ามาจาà¸� port นั้น
นี้เป็นà¸�ารทำงานปรà¸�ติโดยใช้ [ประà¸�าศà¸�ารà¸à¹‰à¸²à¸‡à¸à¸´à¸‡](./dependencies) เพื่à¸à¹€à¸žà¸´à¹ˆà¸¡ webserver library ขà¸à¸‡ app, เช่น [Tornado](http://www.tornadoweb.org/) สำหรับ Python, [Thin](http://code.macournoyer.com/thin/) สำหรับ Ruby หรืภ[Jetty](http://www.eclipse.org/jetty/) สำหรับ Java à¹�ละภาษา JVM-based à¸à¸·à¹ˆà¸™à¹† เà¸�ิดขึ้นใน *user space* นั้นคืà¸à¸ ายใน code ขà¸à¸‡ app ซึ่งสัà¸�à¸�าà¸�ับสภาพà¹�วดล้à¸à¸¡à¸�ารดำเนินงานที่เชื่à¸à¸¡à¹‚ยงà¸�ับ port เพื่à¸à¸šà¸£à¸´à¸�าร request ที่เข้ามา
HTTP ไม่เป็นเพียง service ที่สามารถนำà¸à¸à¸�โดยà¸�ารเชื่à¸à¸¡à¹‚ยง port, server software เà¸�ืà¸à¸šà¸—ุà¸�ชนิดสามารถทำงานผ่านà¸�ารเชื่à¸à¸¡à¹‚ยง process ไปยัง port à¹�ละรภrequest ที่เข้ามา, ตัวà¸à¸¢à¹ˆà¸²à¸‡à¸£à¸§à¸¡à¸—ั้ง ejabberd](http://www.ejabberd.im/) (speaking [XMPP](http://xmpp.org/)), à¹�ละ [Redis](http://redis.io/) (speaking the [Redis protocol](http://redis.io/topics/protocol))
หมายเหตุ, วิธีà¸�ารเชื่à¸à¸¡à¹‚ยง port หมายความว่า app จะà¸�ลายเป็น [backing service](./backing-services) สำหรับ app à¸à¸·à¹ˆà¸™à¹† โดยà¸�ารให้ URL à¸�ับ backing app เป็นตัวจัดà¸�ารทรัพยาà¸�รใน [à¸�ารตั้งค่า](./config) สำหรับใช้งาน app
content/pl/processes.md 0000644 0001750 0005670 00000005335 15264202076 013732 0 ustar 00 0000000 0000000 ## VI. Procesy
### Uruchamiaj aplikację jako jeden lub więcej bezstanowych procesów
Aplikacja jest uruchamiana w środowisku wykonawczym w postaci jednego lub kilku *procesów*.
W najprostszym przypadku kod aplikacji jest samodzielnym skryptem, środowiskiem wykonawczym jest laptop developera z wsparciem dla języka programowania, a proces jest uruchamiany za pomocą linii komend (na przykład `python my_script.py`). Innym razem wdrożenie produkcyjne mocno rozwiniętej aplikacji może wymagać wiele [różnych rodzajów procesów](./concurrency).
**Wg zasad 12factor, procesy są bezstanowe i [nie-współdzielące](http://en.wikipedia.org/wiki/Shared_nothing_architecture).** Jakiekolwiek dane wymagające zapisu musza być zmagazynowane w "trwałej" [usłudze wspierającej](./backing-services), najczęściej będącą bazą danych.
Przestrzeń adresowa lub system plików procesu mogą być używane jako tymczasowy cache dla pojedynczych operacji. Przykładem jest pobieranie dużych plików, działanie na nich, a następnie zapisywanie wyników operacji w bazie danych. Aplikacja dwunastu aspektów nigdy nie zakłada, że jakiś fragment informacji zapisany w pamięci lub dysku będzie dostępny w przyszłości podczas jakiegokolwiek zapytania -- wraz z wieloma aktywnymi procesami rośnie szansa, że przyszłe zapytanie zostanie obsłużone przez zupełnie inny proces. Nawet w przypadku pojedynczego procesu, restart (spowodowany przez deployment kodu, zmianę konfiguracji lub relokacja procesu do innej fizycznej lokalizacji wykonana przez środowisko wykonawcze) zazwyczaj usunie wszystkie dane z lokalnego stanu aplikacji (system plików, pamięć podręczna).
Narzędzie do pakowania plików, z których korzysta aplikacja (takie jak [Jammit](http://documentcloud.github.com/jammit/) lub [django-compressor](http://django-compressor.readthedocs.org/)) używają systemu plików jako cache dla skompilowanych zasobów. Wg 12factor taka kompilacja powinna mieć miejsce podczas [etapu budowy aplikacji](./build-release-run), jak to się dzieje np. w [Rails asset pipeline](http://guides.rubyonrails.org/asset_pipeline.html).
Niektóre systemy sieciowe polegają na tzw. ["sticky sessions"](http://en.wikipedia.org/wiki/Load_balancing_%28computing%29#Persistence) -- oznacza to, że sesja użytkownika jest zapisywana tymczasowo w pamięci procesu aplikacji, zakładając, że kolejne zapytania dotyczące użytkownika będą kierowane do tego samego procesu. "Sticky sessions" są złamaniem zasad aplikacji 12factor i nigdy nie powinny być używane jako źródło informacji. Dane sesji nadają się bardziej do zapisu w magazynie oferującym wygasanie danych w czasie, jak np. [Memcached](http://memcached.org/) czy [Redis](http://redis.io/).
content/tr/build-release-run.md 0000644 0001750 0005670 00000005551 15264202076 015255 0 ustar 00 0000000 0000000 ## V. Derleme, Sürüm, Çalıştırma
### Derleme ve çalıştırma aşamalarını tam olarak ayırma
Bir [kod tabanı](./codebase) üç aşamada dağıtıma dönüşebilir:
* *Derleme aşaması* kod deposunun *derleme* olarak bilinen çalıştırılabilir pakette çeviren bir dönüşümdür.Dağıtım süreci tarafından belirlenen bir commit'deki kodun versiyonunu kullanırken, derleme aşaması sağlayıcı [bağımlılıkları](./dependencies) getirir ve binary'leri derler.
* *Sürüm aşaması*, derleme aşaması tarafından üretilmiş derlemeyi alır ve dağıtımı şu anki [yapılandırmasıyla](./config) birleştirir. Son durumda oluşan *sürüm* derleme ve yapılandırmanın ikisinide içerir ve çalışma ortamındaki doğrudan çalıştırma için hazırdır.
* *Çalıştırma evresi* (aynı zamanda "runtime" olarak bilinir) seçili sürümün karşılığındaki uygulamanın [süreçlerini](./processes) bazı setlerini başlatarak, çalıştırma ortamındaki uygulamayı çalıştırır.

**On iki faktör uygulamaları derleme,sürüm ve çalıştırma aşamaları arasında mutlak ayırmayı kullanır.** Örneğin, koddaki değişiklikleri derleme aşamasına geri döndürmenin bir yolu olmadığı için çalışma zamanında kodda değişiklik yapmak imkansızdır.
Dağıtım araçları genel olarak sürüm yönetim araçlarını önerir, en dikkat çekeni bir önceki sürüme geri dönme yeteneğidir. Örneğin, [Capistrano](https://github.com/capistrano/capistrano/wiki) dağıtım aracı sürümleri, şu anki sürümün şimdiki sürüm dizinine bir sembolik link olduğu, `releases` adlı alt dizinde depolar. `rollback` komutu, bir önceki sürüme hızlı geri dönüşü kolaylaştırır.
Her sürüm her zaman sürümlerin zaman damgası gibi (`2011-04-06-20:32:17` gibi) özel sürüm ID'sine veya artış numarasına (`v100` gibi) sahip olmalıdır. Sürümler yalnızca eklemeli bir defterdir ve bir kere oluşturulduğu zaman dönüştürülemez. Herhangi bir değişiklik yeni bir sürüm oluşturmalıdır.
Derlemeler, herhangi bir zamanda yeni kod dağıtıldığında uygulama geliştiricileri tarafından başlatılır. Çalışma zamanı yürütmesi, kontras tarafından, sunucu tekrar çalıştırılması veya çökmüş süreçlerin süreç yöneticisi tarafından tekrar başlatılması gibi durumlarda otomatik olarak olabilir. Bunun sonucunda, çalıştırma evresi, gecenin bir yarısında çalışan geliştiriciler yokken uygulamanın çalışmasını engelleyen problemler uygulamanın bozulmasına yol açabildiği için, olabildiği kadar az sayıda hareketli bölüm olarak tutulmalıdır. Derleme evresinde, hatalar dağıtımı çalıştıran geliştiriciler için her zaman ön planda olduğu için daha fazla karış olabilir.
content/zh_cn/config.md 0000644 0001750 0005670 00000005417 15264202076 013660 0 ustar 00 0000000 0000000 ## III. �置
### 在环境ä¸å˜å‚¨é…�ç½®
通常,应用的 *é…�ç½®* 在ä¸�å�Œ [部署](./codebase) (预å�‘布ã€�生产环境ã€�å¼€å�‘环境ç‰ç‰)间会有很大差异。这其ä¸åŒ…括:
* 数�库,Memcached,以�其他 [�端�务](./backing-services) 的�置
* 第三方æœ�务的è¯�书,如 Amazon S3ã€�Twitter ç‰
* æ¯�份部署特有的é…�置,如域å��ç‰
有些应用在代ç �ä¸ä½¿ç”¨å¸¸é‡�ä¿�å˜é…�置,这与 12-Factor 所è¦�求的**代ç �å’Œé…�ç½®ä¸¥æ ¼åˆ†ç¦»**显然大相径åºã€‚é…�置文件在å�„部署间å˜åœ¨å¤§å¹…差异,代ç �å�´å®Œå…¨ä¸€è‡´ã€‚
判æ–一个应用是å�¦æ£ç¡®åœ°å°†é…�置排除在代ç �之外,一个简å�•的方法是看该应用的基准代ç �是å�¦å�¯ä»¥ç«‹åˆ»å¼€æº�,而ä¸�用担心会暴露任何æ•�感的信æ�¯ã€‚
需è¦�指出的是,这里定义的"é…�ç½®"å¹¶**ä¸�**包括应用的内部é…�置,比如 Rails çš„ `config/routes.rb`,或是使用 [Spring](http://spring.io/) æ—¶ [代ç �模å�—é—´çš„ä¾�赖注入关系](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html) 。这类é…�置在ä¸�å�Œéƒ¨ç½²é—´ä¸�å˜åœ¨å·®å¼‚,所以应该写入代ç �。
å�¦å¤–一个解决方法是使用é…�置文件,但ä¸�把它们纳入版本控制系统,就åƒ� Rails çš„ `config/database.yml` 。这相对于在代ç �ä¸ä½¿ç”¨å¸¸é‡�å·²ç»�是长足进æ¥ï¼Œä½†ä»�然有缺点:总是会ä¸�å°�心将é…�置文件ç¾å…¥äº†ä»£ç �库;é…�置文件的å�¯èƒ½ä¼šåˆ†æ•£åœ¨ä¸�å�Œçš„目录,并有ç�€ä¸�å�Œçš„æ ¼å¼�,这让找出一个地方æ�¥ç»Ÿä¸€ç®¡ç�†æ‰€æœ‰é…�ç½®å�˜çš„ä¸�å¤ªçŽ°å®žã€‚æ›´ç³Ÿçš„æ˜¯ï¼Œè¿™äº›æ ¼å¼�通常是è¯è¨€æˆ–框架特定的。
**12-Factor推è��将应用的é…�ç½®å˜å‚¨äºŽ *环境å�˜é‡�* ä¸**( *env vars*, *env* )。环境å�˜é‡�å�¯ä»¥é�žå¸¸æ–¹ä¾¿åœ°åœ¨ä¸�å�Œçš„部署间å�šä¿®æ”¹ï¼Œå�´ä¸�动一行代ç �;与é…�置文件ä¸�å�Œï¼Œä¸�å°�心把它们ç¾å…¥ä»£ç �åº“çš„æ¦‚çŽ‡å¾®ä¹Žå…¶å¾®ï¼›ä¸Žä¸€äº›ä¼ ç»Ÿçš„è§£å†³é…�置问题的机制(比如 Java 的属性é…�置文件)相比,环境å�˜é‡�与è¯è¨€å’Œç³»ç»Ÿæ— 关。
é…�置管ç�†çš„å�¦ä¸€ä¸ªæ–¹é�¢æ˜¯åˆ†ç»„。有时应用会将é…�置按照特定部署进行分组(或å�«å�šâ€œçŽ¯å¢ƒâ€�),例如Railsä¸çš„ `development`,`test`, å’Œ `production` 环境。这ç§�æ–¹æ³•æ— æ³•è½»æ˜“æ‰©å±•ï¼šæ›´å¤šéƒ¨ç½²æ„�味ç�€æ›´å¤šæ–°çš„环境,例如 `staging` 或 `qa` 。 éš�ç�€é¡¹ç›®çš„ä¸�æ–æ·±å…¥ï¼Œå¼€å�‘人员å�¯èƒ½è¿˜ä¼šæ·»åŠ ä»–ä»¬è‡ªå·±çš„çŽ¯å¢ƒï¼Œæ¯”å¦‚ `joes-staging` ,这将导致å�„ç§�é…�置组å�ˆçš„æ¿€å¢žï¼Œä»Žè€Œç»™ç®¡ç�†éƒ¨ç½²å¢žåŠ äº†å¾ˆå¤šä¸�ç¡®å®šå› ç´ ã€‚
12-Factor 应用ä¸ï¼ŒçŽ¯å¢ƒå�˜é‡�的粒度è¦�足够å°�,且相对独立。它们永远也ä¸�会组å�ˆæˆ�一个所谓的“环境â€�,而是独立å˜åœ¨äºŽæ¯�个部署之ä¸ã€‚当应用程åº�ä¸�æ–æ‰©å±•,需è¦�更多ç§�类的部署时,这ç§�é…�置管ç�†æ–¹å¼�能够å�šåˆ°å¹³æ»‘过渡。
content/de/dev-prod-parity.md 0000644 0001750 0005670 00000011154 15264202076 014723 0 ustar 00 0000000 0000000 ##X. Dev-Prod-Vergleichbarkeit
### Entwicklung, Staging und Produktion so ähnlich wie möglich halten
Historisch gibt es große Lücken zwischen Entwicklung (wo ein Entwickler live an einem lokalen [Deploy](./codebase) der App Änderungen macht) und Produktion (ein laufender Deploy der App, auf den Endbenutzer zugreifen). Diese Lücken zeigen sich auf drei Gebieten:
* **Die Zeit-Lücke** Ein Entwickler arbeitet an Code der Tage, Wochen oder sogar Monate braucht um in Produktion zu gehen.
* **Die Personal-Lücke**: Entwickler schreiben Code, Operatoren deployen ihn.
* **Die Werkzeug-Lücke**: Entwickler nutzen vielleicht einen Stack wie Nginx, SQLite und OS X - die Produktion nutzt Apache, MySQL und Linux.
**Die Zwölf-Faktor-App ist ausgelegt auf [Continuous Deployment](http://avc.com/2011/02/continuous-deployment/) indem sie die Lücke zwischen Entwicklung und Produktion klein hält.** Mit Blick auf die oben beschriebenen drei Lücken:
* Die Zeit-Lücke klein halten: Ein Entwickler kann Code schreiben, der Stunden oder sogar Minuten später deployed wird.
* Die Personal-Lücke klein halten: Entwickler die Code schreiben sind intensiv am Deployment und der Überwachung des Verhaltens auf Produktion beteiligt.
* Die Werkzeug-Lücke klein halten: Entwicklung und Produktion so ähnlich wie möglich halten.
Das Gesagte in einer Tabelle:
|
Traditionelle App |
Zwölf-Faktor-App |
| Zeit zwischen Deployments |
Wochen |
Stunden |
| Code-Autoren und Code-Deployer |
Andere Menschen |
Dieselben Menschen |
| Entwicklungs- und Produktions-Umgebung |
Unterschiedlich |
So ähnlich wie möglich |
Im Bereich der [unterstützenden Dienste](./backing-services) wie der Datenbank der App, dem Queue-System oder dem Cache ist die Dev-Prod-Vergleichbarkeit wichtig. Viele Sprachen bieten Bibliotheken, die den Zugriff auf die unterstützenden Dienste vereinfachen und ebenso *Adapter* für unterschiedliche Arten von Diensten.
| Art |
Sprache |
Bibliothek |
Adapter |
| Datenbank |
Ruby/Rails |
ActiveRecord |
MySQL, PostgreSQL, SQLite |
| Queue |
Python/Django |
Celery |
RabbitMQ, Beanstalkd, Redis |
| Cache |
Ruby/Rails |
ActiveSupport::Cache |
Speicher, Dateisystem, Memcached |
Für Entwickler ist es sehr elegant, einen leichtgewichtigen unterstützenden Dienst in der lokalen Umgebung zu benutzen, während ein ernst zu nehmender und robuster unterstützender Dienst in Produktion verwendet wird. So kann man SQLite lokal und PostgreSQL in Produktion benutzen; oder zum Cachen den lokalen Speicher in Entwicklung und Memcached in Produktion.
**Der Zwölf-Faktor-Entwickler widersteht dem Drang, verschiedene unterstützende Dienste in Entwicklung und Produktion zu verwenden**, selbst wenn Adapter über alle Unterschiede hinweg abstrahieren. Unterschiede zwischen den unterstützenden Diensten verursachen kleinste Inkompatiblitäten, und Code, der in Entwicklung oder Staging funktioniert und Tests besteht, scheitert in Produktion. Diese Reibungskosten und die dann notwendige Dämpfung des Continuous Deployment sind sehr hoch, wenn man sie über die Lebensdauer einer App aggregiert.
Leichtgewichtige lokale Dienste überzeugen weniger als früher. Moderne unterstützende Dienste wie Memcached, PostgreSQL und RabbitMQ sind dank moderner Paketierungs-Systeme wie [Homebrew](http://mxcl.github.com/homebrew/) und [apt-get](https://help.ubuntu.com/community/AptGet/Howto) nicht schwierig zu installieren und zu starten. Auch deklarative Installationssysteme wie [Chef](http://www.opscode.com/chef/) oder [Puppet](http://docs.puppetlabs.com/) in Kombination mit leichtgewichtigen virtuellen Umgebungen wie [Vagrant](http://vagrantup.com/) setzen Entwickler in den Stand, lokale Umgebungen ans Laufen zu bringen, die nahe an Produktionsumgebungen herankommen. Die Installations- und Betriebskosten dieser Systeme sind gering verglichen mit dem Nutzen der Dev-Prod-Vergleichbarkeit und einem Continuous Deployment.
Adapter für unterschiedliche unterstützende Dienste sind weiterhin von Nutzen, weil sie das Portieren auf andere unterstützende Dienste schmerzlos machen. Aber alle Deploys der App (Entwicklungsumgebungen, Staging, Produktion) sollten denselben Typ und dieselbe Version eines jeden unterstützenden Dienstes benutzen.
content/it/who.md 0000644 0001750 0005670 00000000327 15264202076 012516 0 ustar 00 0000000 0000000 A chi è destinato questo documento?
==============================
A ogni sviluppatore che costruisca applicazioni SaaS (Software As a Service), e a ogni ops che effettui il deploy e gestisca queste applicazioni.
content/tr/codebase.md 0000644 0001750 0005670 00000003420 15264202076 013474 0 ustar 00 0000000 0000000 ## I. Kod Tabanı
### Bir çok dağıtım kod tabanı gözden geçirme kontrolünde izlenmeli
On iki faktör bir uygulama her zaman [Git](http://git-scm.com/), [Mercurial](http://mercurial.selenic.com/) veya [Subversion](http://subversion.apache.org/) gibi bir sürüm takip sistemiyle izlenir. VEritabanının gözden geçirme sisteminin bir kopyası *kod deposu* olarak bilinir. *kod repo* ya da sadece *repo* olarak kısaltılır.
Bir *kod tabanı* herhangi tek bir depo(Subversion gibi merkezi gözden geçirme kontrol sistemi) ya da kök işleyicini paylaşan bir takım repodur(Git gibi merkezi olmayan gözden geçirme kontrol sistemi).

Kod tabanı ve uygulama arasında bire-bir ilişki her zaman vardır:
* Eğer birden fazla kod tabanı varsa bu bir uygulama değil, dağıtık sistemdir. Dağıtık sistemdeki her bileşen bir uygulamadır ve her biri on iki faktörle bireysel olarak uyumlu olmalıdır.
* Aynı kodu paylaşan birden fazla uygulama, on iki faktörü ihlal eder. Burada çözüm, paylaşılan kodun [bağımlılık yöneticisi](./dependencies) aracılığıyla dahil edilebilecek kütüphanelere dönüştürülmesidir.
Uygulamanın sadece bir kod tabanı vardır fakat birden fazla dağıtımı olacaktır. Bir *dağıtım*, uygulamanın çalışan bir örneğidir. Ayrıca her geliştiricinin kendi yerel geliştirme ortamında çalışan bir kopyası vardır ve bunların her biri aynı zamanda dağıtım olarak nitelendirilirler.
Sürümler her bir dağıtımda etkin olabilir fakat kod temeli tüm dağıtımlarda aynıdır. Örneğin, geliştiricilerin henüz uygulamaya eklenmemiş commitleri olabilir. Bu nedenle hepsi ayrı dağıtım olarak tanımlanır ama kod tabanı aynıdır.
content/zh_cn/admin-processes.md 0000644 0001750 0005670 00000003524 15264202076 015504 0 ustar 00 0000000 0000000 ## XII. 管�进程
### ��管�任务当作一次性进程�行
[进程构æˆ�](./concurrency)(process formation)是指用æ�¥å¤„ç�†åº”用的常规业务(比如处ç�† web 请求)的一组进程。与æ¤ä¸�å�Œï¼Œå¼€å�‘人员ç»�常希望执行一些管ç�†æˆ–维护应用的一次性任务,例如:
* è¿�行数æ�®ç§»æ¤�(Django ä¸çš„ `manage.py migrate`, Rails ä¸çš„ `rake db:migrate`)。
* è¿�行一个控制å�°ï¼ˆä¹Ÿè¢«ç§°ä¸º [REPL](http://en.wikipedia.org/wiki/Read-eval-print_loop) shell),æ�¥æ‰§è¡Œä¸€äº›ä»£ç �或是针对线上数æ�®åº“å�šä¸€äº›æ£€æŸ¥ã€‚大多数è¯è¨€éƒ½é€šè¿‡è§£é‡Šå™¨æ��供了一个 REPL 工具(`python` 或 `perl`) ,或是其他命令(Ruby 使用 `irb`, Rails 使用 `rails console`)。
* è¿�行一些æ��交到代ç �仓库的一次性脚本。
一次性管ç�†è¿›ç¨‹åº”该和æ£å¸¸çš„ [常驻进程](./processes) 使用å�Œæ ·çš„环境。这些管ç�†è¿›ç¨‹å’Œä»»ä½•å…¶ä»–çš„è¿›ç¨‹ä¸€æ ·ä½¿ç”¨ç›¸å�Œçš„ [代ç �](./codebase) å’Œ [é…�ç½®](./config) ,基于æŸ�个 [å�‘布版本](./build-release-run) è¿�行。å�Žå�°ç®¡ç�†ä»£ç �应该éš�其他应用程åº�代ç �一起å�‘布,从而é�¿å…�å�Œæ¥é—®é¢˜ã€‚
所有进程类型应该使用å�Œæ ·çš„ [ä¾�赖隔离](./dependencies) 技术。例如,如果Rubyçš„web进程使用了命令 `bundle exec thin start` ,那么数æ�®åº“ç§»æ¤�应使用 `bundle exec rake db:migrate` 。å�Œæ ·çš„,如果一个 Python 程åº�使用了 Virtualenv,则需è¦�在è¿�行 Tornado Web æœ�务器和任何 `manage.py` 管ç�†è¿›ç¨‹æ—¶å¼•å…¥ `bin/python` 。
12-factor 尤其é�’ç��那些æ��供了 REPL shell çš„è¯è¨€ï¼Œå› 为那会让è¿�行一次性脚本å�˜å¾—简å�•。在本地部署ä¸ï¼Œå¼€å�‘人员直接在命令行使用 shell 命令调用一次性管ç�†è¿›ç¨‹ã€‚在线上部署ä¸ï¼Œå¼€å�‘人员ä¾�æ—§å�¯ä»¥ä½¿ç”¨ssh或是è¿�行环境æ��供的其他机制æ�¥è¿�è¡Œè¿™æ ·çš„è¿›ç¨‹ã€‚
content/th/backing-services.md 0000644 0001750 0005670 00000012205 15264202076 015135 0 ustar 00 0000000 0000000 ## IV. Backing services
### จัด�าร�ับบริ�ารสนับสนุน (backing service) ให้เป็นทรัพยา�รที่�นบมา
*บริà¸�ารสนับสนุน (backing service)** เป็นบริà¸�ารใดๆ ที่ app ใช้บริà¸�ารผ่านระบบเครืà¸à¸‚่ายซึ่งเป็นส่วนหนึ่งขà¸à¸‡à¸�ารดำเนินงาน (operation) ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™ รวมที่เà¸�็บข้à¸à¸¡à¸¹à¸¥ (datastore) (เช่น [MySQL](http://dev.mysql.com/) หรืภ[CouchDB](http://couchdb.apache.org/)), ระบบ messaging/queueing (เช่น [RabbitMQ](http://www.rabbitmq.com/) หรืภ[Beanstalkd](https://beanstalkd.github.io)), บริà¸�าร SMTP สำหรับส่งà¸à¸µà¹€à¸¡à¸¥à¹Œà¸à¸à¸� (เช่น [Postfix](http://www.postfix.org/)), à¹�ละระบบ caching (เช่น [Memcached](http://memcached.org/))
บริà¸�ารสนับสนุนà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™à¸�านข้à¸à¸¡à¸¹à¸¥à¹€à¸›à¹‡à¸™à¸�ารจัดà¸�ารà¹�บบดั่งเดิมด้วยผู้จัà¸�ารระบบเดียวà¸�ันà¸�ับ app ที่ทำงานหลังจาà¸� deploy เพิ่มเติมจาà¸�บริà¸�ารจัดà¸�ารภายใน, app à¸à¸²à¸ˆà¸ˆà¸°à¸¡à¸µà¸šà¸£à¸´à¸�ารที่ให้บริà¸�ารà¹�ละจัดà¸�ารโดยบริà¸�ารภายนà¸à¸� (third parties) ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™ รวมบริà¸�าร SMTP (เช่น [Postmark](http://postmarkapp.com/)), บริà¸�าร metrics-gathering (เช่น [New Relic](http://newrelic.com/) หรืภ[Loggly](http://www.loggly.com/)), บริà¸�าร binary asset (เช่น [Amazon S3](http://aws.amazon.com/s3/)), à¹�ละà¹�ม้à¹�ต่บริà¸�าร API-accessible consumer (เช่น [Twitter](http://dev.twitter.com/), [Google Maps](https://developers.google.com/maps/), หรืภ[Last.fm](http://www.last.fm/api)).
**code สำหรับ twelve-factor app จะไม่มีความà¹�ตà¸�ต่างระหว่างบริà¸�ารภายใน (local) à¹�ละบริà¸�ารภายนà¸à¸� (third party)** ใน app ทั้งสà¸à¸‡à¸šà¸£à¸´à¸�ารจะเป็นทรัพยาà¸�รที่à¹�นบà¸à¸¢à¸¹à¹ˆà¹ƒà¸™ app à¹�ละเข้าถึงได้ด้วย URL หรืà¸à¸—ี่เà¸�็บ locator/credentials à¸à¸·à¹ˆà¸™à¹†à¹ƒà¸™ [à¸�ารตั้งค่า](./config). [deploy](./codebase) ขà¸à¸‡ twelve-factor app ควรจะส่ามารถสลับสับเปลี่ยนà¸�านข้à¸à¸¡à¸¹à¸¥ MySQL ใน app ด้วยบริà¸�ารภายนà¸à¸� (เช่น [Amazon RDS](http://aws.amazon.com/rds/)) โดยไม่ต้à¸à¸‡à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™ code ขà¸à¸‡ app เหมืà¸à¸™à¸�ับ SMTP ภายใน app ควรสามารถสลับสับเปลี่ยนด้วยบริà¸�าร SMTP ภายนà¸à¸�ได้ (เช่น Postmark) โดยไม่ต้à¸à¸‡à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™ code ในทั้งสà¸à¸‡à¸�รณีทรัพยาà¸�รจัดà¸�ารด้วยà¸�ารตั้งค่าที่จะต้à¸à¸‡à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹€à¸—่านั้น
สิ่งที่à¹�ตà¸�ต่างà¸�ันขà¸à¸‡à¸šà¸£à¸´à¸�ารสนับสนุนคืภ*ทรัพยาà¸�ร* ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™ à¸�านข้à¸à¸¡à¸¹à¸¥ MySQL เป็นทรัพยาà¸�ร; à¸�านข้à¸à¸¡à¸¹à¸¥ MySQL 2 à¸�านข้à¸à¸¡à¸¹à¸¥ (ใช้สำหรับ sharding ใน application layer) มีคุณสมบัติเป็นทรัพยาà¸�รที่à¹�ตà¸�ต่างà¸�ัน 2 à¹�หล่ง, twelve-factor app จัà¸�à¸�ารà¸�านข้à¸à¸¡à¸¹à¸¥à¹€à¸›à¹‡à¸™ *ทรัพยาà¸�รà¹�นบ (attached resouces)* ซึ่งเป็นà¸�ารระบุ loose coupling à¸�ับ deploy ที่ทรัพยาà¸�รเหล่านี้à¹�นบใช้งาน
ทรัพยาà¸�รสามารถà¹�นบà¹�ละถà¸à¸”à¸à¸à¸�จาà¸� deploy ได้ ตัวà¸à¸¢à¹ˆà¸²à¸‡à¹€à¸Šà¹ˆà¸™ ถ้าà¸�านข้à¸à¸¡à¸¹à¸¥à¸‚à¸à¸‡ app ทำงานผิดปรà¸�ติเนื่à¸à¸‡à¸ˆà¸²à¸�ปัà¸�หาขà¸à¸‡à¸®à¸²à¸£à¹Œà¸”à¹�วร์ ผู้ดูà¹�ลระบบขà¸à¸‡ app à¸à¸²à¸ˆà¸ˆà¸° spin up เซิร์ฟเวà¸à¸£à¹Œà¸�านข้à¸à¸¡à¸¹à¸¥à¸‚ึ้นมาใหม่จาà¸�à¸�ารข้à¸à¸¡à¸¹à¸¥à¸—ี่สำรà¸à¸‡à¸¥à¹ˆà¸²à¸ªà¸¸à¸” à¸�านข้à¸à¸¡à¸¹à¸¥à¸‚à¸à¸‡ production ปัจจุบันควรจะถà¸à¸”à¸à¸à¸�à¹�ละà¹�นบด้วยà¸�านข้à¸à¸¡à¸¹à¸¥à¹ƒà¸«à¸¡à¹ˆ -- ทั้งหมดนี้ไม่มีà¸�ารเปลี่ยนà¹�ปลง code
public/images/attached-resources.png 0000644 0001750 0005670 00000155173 15264202076 016341 0 ustar 00 0000000 0000000 ‰PNG
IHDR h Æ Ÿ¨Š pHYs šœ IDATxì�œãÝlj
‚ ˆ·«NÒ
‚ !jSQQQQQ¤®©ûõm´EÅ‹J\*ˆºkTQ‹”¨ *%*š%AԪДU‹÷û;™Ù>;{ÎÙsvÏîž³ûû>¿}®3óÌwfgžÿ<ÏÌéúÕW_u±™€ ˜€ ˜€ ˜€ ˜€ ˜€ ´?�Ú¿ n� ˜€ ˜€ ˜€ ˜€ ˜€ ˜€ØAóy`&`&`&`&`&`%BÀZ‰7ÃLÀLÀLÀLÀLÀì ù000000�!нDÚáf˜€ ˜@IèÚµkª¤äƘ@óÔð1°eÍ[ÔK™€ ˜€ ´�®þŠc{`÷6MÀJ• ŽÙ`ÚvêSªmt»L uÔ½ˆ{ýÙ,ãª&`&`íHÀZ;Â÷¦MÀJ� ÚC´jDéµÌ-2�X'¦EkðÂ&`&`mBÀï µ foÄL Œô(£¶º©&�/�žùVt=00�ö%àwÐÚ—¿·n&Pú–ÐÄÚÒo¦[h
T�ò=¾'LÀL <øâ]ÇÉ4h?25¬ªý6ï-›@ᘪ»�¥R…/é%LÀLÀÚ›€§8¶÷ðöMÀLÀLÀLÀLÀL "`ͧ‚ ˜€ ˜€ ˜€ ˜€ ˜€ ”;h%r Ü00000°ƒæsÀLÀLÀLÀLÀLÀJ„€´9n† ˜€ ˜€ ˜€ ˜€ ˜€ ØAó9`&`&`&`&`&`%BÀZ‰7ÃLÀLÀLÀLÀLÀì ù000000�!`D„›a&`&`&`&`&`vÐ|˜€ ˜€ ˜€ ˜€ ˜€ ˜@‰°ƒV"ÂÍ000000;h>LÀLÀLÀLÀLÀL DØA+‘áf˜€ ˜€ ˜€ ˜€ ˜€ ˜€4Ÿ&`&`&`&`&`&P"ì •È�p3LÀLÀLÀLÀLÀLÀšÏ00000(vÐJä@¸&`&`&`&`&`&`Íç€ ˜€ ˜€ ˜€ ˜€ ˜€ ”;h%r Ü00000°ƒæsÀLÀLÀLÀLÀLÀJ„€´9n† ˜€ ˜€ ˜€ ˜€ ˜€ ØAó9`&`&`&`&`&`%BÀZ‰7ÃLÀLÀLÀLÀLÀì ù000000�!`D„›a&`&`&`&`&`vÐ|˜€ ˜€ ˜€ ˜€ ˜€ ˜@‰°ƒV"ÂÍ000000;h>LÀLÀLÀLÀLÀL DØA+‘áf˜€ ˜€ ˜€ ˜€ ˜€ ˜€4Ÿ&`&`&`&`&`&P"ì •È�p3LÀLÀLÀLÀLÀLÀšÏ00000(vÐJä@¸&`&`&`&`&`&`Íç€ ˜€ ˜€ ˜€ ˜€ ˜€ ”;h%r Ü00000°ƒæsÀLÀLÀLÀLÀLÀJ„€´9n† ˜€ ˜€ ˜€ ˜€ ˜€ ØAó9`&`&`&`&`&`%BÀZ‰7ÃLÀLÀLÀLÀLÀì ù000000�!`D„›a&`&`&`&`&`vÐ|˜€ ˜€ ˜€ ˜€ ˜€ ˜@‰°ƒV"ÂÍ000000;h>LÀLÀLÀLÀLÀL DØA+‘áf˜€ ˜@¡ºvíúUÕ‘÷o´Ýˆ6(t½-Ï6ëÛÕÒu5µ<ÛZÝÖkËí‡ÛuÜLÀLÀŠAÀZ1(z&`&P:ºÑ”UP
�AÏâ°Tv8c¿öc§þŠÚLÀLÀL C°ƒÖ!£wÂLÀ²XŸ’ó³––w�FÎÖIîÂW_}Õ5V²Ìi00(uvÐJý¹}&`&��À!Y‘êß@“‚ÅF(Ný#¾z}‚fÄu‰ï�žŽòÿEø$Ú;.Cò{£É¨iZåt´YXGqò²NyÌVFþ
è(ôg¤6.E£�âu†Û!?½�¸,L'êåµñòQ¸.áDôú½†NB]Ãu;n&`&`Å §ŒÅX�×a&`‚ }îÇÙ‘Ê`g†q�¬
Ò%¥õp9haÃ([�ôÇQÞç”-¬••Ϥ|7Ê'�>%ÊK?§Îyq&u5�ò9ô8/
ÿI¸Vœ§v…ÛU:.S˜©LPt'Ê4u±ŽüÝ�ŽS#˵=V[ÈþÕ³e#o!9½I;�íi�%gìëB•
Ö—¶ViGMÀLÀJ”€GÐJôÀ¸Y&`&ÐtÌ»#½sva°ü»A<޾N$…z£SXf¸B${
mIqÙ¹Ôùöòhúïñü��³¿O¡
Ñ"ÔR;„ÄÎÙ‹Ä7Ak ÛQwtiÒÑS:™G½zkÆþÕ/KDŽî@$‡ö:ÛØ8ÒYC¸®„tÙLÀLÀŠDÀZ‘@z5&`&Оè$ÇSü>§r’ŽÚ3-ˆÇÑsqhÞD 9X?�Ï ïïñ3£|�j�ÅìÄO¡®Ö¥‘¦3‚üæFÇžÌz 9I§£'PìHÕšŒºá
�cû/¡‘Y?ŠH¼oX©“Æ÷`¿—pþMì¤ûïÝ60�¢Ð“H› ˜€ ˜@Ç%ð7víÜ»§‘©Ð†‰§‚ø“A|Ç Þ?ˆ?ÄÿÄ›Ý*XpNÇAZL¼2Nºáêç‰%AükA¼³FG±ãÝ�
ØLÀLÀŠ@À#hE€èU˜€ ˜@ ø’¶,Cššx)Œc£÷Â’–ÌÓÂØ–ÆÂ�‚øšA|Õ þï ®‘®¼ŒQuì3YØ–O2UhF^¸Î|ö/Ü„FÎÒK�PÚ ¿‘Œi†b&`&PvЊÃÑk10�v%€ã�~‹°Z
õG§¢³4¬6‘Ö�™^A½°N½ÓByX_ïie5:õá¨SÏ,Ãu‡ÛÏR=¯ì°ía{Ãõ‡uêW
Ãðƒ!õùŽtѨäÚh¾Xpl‡¡3sHëk¡!}ØÅf&`&�;hy@r0èhð94ÒZýTB2w
©�³ƒüyA|û >$ˆÇÑÏâaøA‰ø##Aq:úR�Q¿n:ù)T…*£òzlj¼®Á2™¢…î_¦u8¯!�½£äZ„' û�Ž�~"A¹„ôÍHï%¾…äÄÙa› ˜€ ä `-™€ ˜@'"ðÛ`_5âÑW"/üä•A�»‚ø%ÔM!}Åñâ ?Ž.ˆ#„gQoU4€øUA~U§>¶‹©»1’ðk´º"*ÔTÎØ´ýuãD†°Ðý˰
g%Äš~‚áXÊ^D;!9Þ+¡u�FØäHÉñiä°‘o30H°ƒ– ⤠˜€ tFt°ïa¿¯�öý›„ú‚£¤¸ì"êÌ\MÿUÝç£ô„Q5Z%íê cq9V/£p4-¨ÒåF÷G[ÊÁû éÓû_ S‘,S['§s3üiÆþeX‹³b8[:.¡÷Ðu¤{n‹äŒ-�·ÞEŒßsÔqy…Û¤m&`&`ØAË ÅY&`&РЩ>šý> ÍBŸ"}üãOh?ÊÎ"¬7Òÿ!¡÷Šn@ú�ˆœ®hj`Ô�DÆOÑëHÙxÉ ÓhK#£þ—dþ �ˆ4ÝQÛú¥×Où£ÄeÇ *¤)”r¼ÿDº�±\Þû×`A'2ˆGÏî�Ž×p*‚ž']-×¹�¼É¶q꺡�Fõ˜€ ˜€ @@/•„ ˜€ ˜@D€ÎâãD+ øNViGM ä p/¤‘© ¡}9�«ƒt‹¢¬_£§Û ‘¬÷Ò׋Î&}>i�ªþ½‹¾Nž~§ï
âuBr6é]ˆW¡§Ñ!HSjÿ¨º„9�eõ `ªÞ•³¢MÀL xš›l&`&`íE ç¨+Û–c¤‡3Iª/±’Ý»<èò½(¼Ouä°É9“ÃölT6*
7'�42zq”×…e2ް‘¿u¦ Eq]‡&`&БØAëHGÓûb&`&`L@v1úÒôÒ5ÑèUÒz·P¦�„Èþ¸