1. Genel Bakış
Sunucusuz Taşıma İstasyonu codelab'leri serisi (kendi kendine ilerleyen, uygulamalı eğiticiler) ve ilgili videolar, Google Cloud sunucusuz geliştiricilerinin uygulamalarını bir veya daha fazla taşıma işleminde yönlendirerek uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu videolar genellikle eski hizmetlerden uzaklaştırılır. Bu sayede uygulamalarınızı daha taşınabilir hale getirir, daha fazla seçenek ve esneklik elde edebilir, daha geniş bir Cloud ürünü yelpazesiyle entegrasyon ve erişim elde edebilir, ayrıca yeni dil sürümlerine kolayca geçiş yapabilirsiniz. Başlangıçta özellikle App Engine (standart ortam) geliştiricileri olmak üzere ilk Cloud kullanıcılarına odaklanan bu seri, Cloud Functions ve Cloud Run gibi diğer sunucusuz platformları veya uygun olduğu durumlarda diğer sunucusuz platformları ya da diğer platformları kapsayacak kadar geniş kapsamlıdır.
Bu codelab'de, Modül 1 codelab'den örnek uygulamaya App Engine Memcache'i eklemeyi ve kullanmayı öğretebilirsiniz. Bu Modül 12 eğiticisine Memcache kullanımını ekleyip ardından Modül 13'te Cloud Memorystore'a geçiş yapacağız.
Demoda aşağıdaki işlemleri yapmayı öğreneceksiniz:
- App Engine Memcache API'sini/kitaplığını kullanma
- Temel Python 2 Flask App Engine NDB uygulamasına önbelleğe alma ekleme
Gerekenler
- Etkin bir GCP faturalandırma hesabına sahip bir Google Cloud Platform projesi
- Temel Python becerileri
- Yaygın Linux komutlarıyla ilgili bilgi
- App Engine uygulamalarını geliştirme ve dağıtma ile ilgili temel bilgiler
- Çalışan bir Modül 1 App Engine uygulaması (kod laboratuvarını tamamlayın [önerilir] veya depodan uygulamayı kopyalayın)
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
2. Arka plan
App Engine Memcache'den geçiş yapmak için bu alanın kullanımını Modül 1 codelab'den elde edilen mevcut Flask ve App Engine NDB uygulamasına ekleyin. Örnek uygulama, kullanıcıya yapılan son on ziyareti gösterir. Aynı kullanıcı tarayıcısını yeniliyorsa sürekli olarak yeni Ziyaret varlıkları oluşturmak ve Datastore'dan en son ziyaretleri getirmek en uygun yöntem değildir. Bu nedenle, en son ziyaretleri önbelleğe alacağız.
Aynı ziyaretçi sayfaya gelirse, bu ziyaretler önbellekten döndürülür. Siteyi yeni bir kullanıcı ziyaret ederse veya bir saat geçerse önbellek temizlenir ve en son girişlerle değiştirilir (kayıtlı yeni bir ziyaretten söz edilmez). Bu App Engine Memcache entegrasyonu uygulandıktan sonra, bir sonraki (Modül 13) codelab'inde bunu Cloud Memorystore'a taşıyabiliriz.
Bu eğitim aşağıdaki adımları içerir:
- Kurulum/Ön Çalışma
- Yapılandırmayı güncelleyin
- Uygulama kodunu değiştir
3. Kurulum/Ön Çalışma
Eğiticinin ana bölümüne geçmeden önce projemizi oluşturalım, kodu alın ve çalışan bir kodla başladığımızı öğrenmemiz için temel uygulamayı dağıtın.
1. Proje oluşturun
Modül 1 codelab'ini tamamladıysanız aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabı olduğundan ve App Engine'in etkin olduğundan emin olun.
2. Temel örnek uygulamayı al
Bu codelab'in ön koşullarından biri, çalışan bir Modül 1 örnek uygulamasına sahip olmaktır. AdSense hesabınız yoksa buraya geçmeden önce iki eğitimden birini (yukarıdaki bağlantılar) tamamlayın. Bu modülün içeriğine aşinaysanız aşağıdaki Modül 1 koduyla başlayabilirsiniz.
İster sizin ister bizimkininkini kullanın, Modül 1 kodunu BAŞLAyeceğiz. Bu codelab'de, Modül 11 depo klasöründeki (FINISH) koda benzeyen bir kod bulunmaktadır ve son adım her adımda size yol gösterir.
- BAŞLAT: Modül 1 klasörü (Python 2)
- SON: Modül 12 klasörü (Python 2)
- Deponun tamamı (ZIP dosyasını klonlamak veya indirmek için)
Modül 1 BAŞLANGIÇ dosyalarının dizini (sizin ya da bizimki) şöyle görünmelidir:
$ ls README.md main.py templates app.yaml requirements.txt
3. Temel uygulamayı (yeniden) dağıtma
Hemen yürütmek için kalan ön çalışma adımlarınız:
gcloud
komut satırı aracını yeniden tanıma- Örnek uygulamayı
gcloud app deploy
ile yeniden dağıtın - Uygulamanın App Engine'de sorunsuz çalıştığını onaylayın
Bu adımları başarıyla uygulayıp web uygulamanızın çalıştığını (aşağıdakine benzer bir çıkışla) gördükten sonra, uygulamanıza önbelleğe alma kullanımını eklemeye hazırsınız demektir.
4. Yapılandırmayı güncelleyin
Standart App Engine yapılandırma dosyalarında (app.yaml
, requirements.txt
, appengine_config.py
) değişiklik yapılmasına gerek yoktur.
5. Uygulama dosyalarını değiştirme
Yalnızca App Engine API eklediğimizden, harici paket yoktur. Diğer bir deyişle, herhangi bir yapılandırma dosyasının (app.yaml
, requirements.txt
, appengine_config.py
) güncellenmesi gerekmez. Yalnızca bir uygulama dosyası (main.py
) bulunduğundan bu bölümdeki tüm değişiklikler yalnızca o dosyayı etkiler.
İçe aktarılanlar
En önemli adım google.appengine.api.memcache
adlı Memcache kitaplığını içe aktarmaktır. En son ziyaretleri bir saat süreyle önbelleğe alacağımızdan, saniye içindeki saniye sayısı için de bir sabit ekleyelim. Kodunuzun önceki hali ve bu değişiklik aşağıda belirtilmiştir:
ÖNCE:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
app = Flask(__name__)
SONRA:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
app = Flask(__name__)
HOUR = 3600
Memcache desteğiyle önbelleğe alma ekleme
En önemli değişiklik, uygulamamıza önbelleğe alma kullanımını eklemektir. Daha açık olmak gerekirse, en son ziyaretleri önbelleğe almalı, önbelleğe alınmış ziyaretlerin mevcut olup olmadığını kontrol etmeli ve planımıza göre önbelleğe alınmış sonuçları mümkün olduğunca çok kullanmaya çalışmalıyız. Uygulamanın amacımıza ulaşmak için atacağı adımlar şunlardır:
- Mevcut ziyareti ayarla ve
visitor
olarak adlandır - Önbellekten en son
visits
öğesini getirmeye çalış - Önbellek boşsa veya en son ziyaretçi (
visits[0]['visitor']
) mevcutvisitor
değerinden farklıysa: Bu son ziyareti saklayın, en son ziyaretleri getirin ve bu ziyaretleri bir saat süreyle önbelleğe alın. - Web şablonu üzerinden kullanıcıya
visits
gösterilsin
Bu güncellemelerin öncesinde ve sonrasında yapılan değişiklikler şöyle:
ÖNCE:
@app.route('/')
def root():
'main application (GET) handler'
store_visit(request.remote_addr, request.user_agent)
visits = fetch_visits(10)
return render_template('index.html', visits=visits)
SONRA:
@app.route('/')
def root():
'main application (GET) handler'
# check for (hour-)cached visits
ip_addr, usr_agt = request.remote_addr, request.user_agent
visitor = '{}: {}'.format(ip_addr, usr_agt)
visits = memcache.get('visits')
# register visit & run DB query if cache empty or new visitor
if not visits or visits[0]['visitor'] != visitor:
store_visit(ip_addr, usr_agt)
visits = list(fetch_visits(10))
memcache.set('visits', visits, HOUR) # set() not add()
return render_template('index.html', visits=visits)
Aşağıda, yapılan değişikliklerin resimli gösterimi verilmiştir:
Bu işlemle, App Engine memcache
kullanımını Modül 1 örnek uygulamasına eklemek için gereken tüm değişiklikler tamamlanmıştır. İşe yaradığını görmek için bu uygulamayı derleyip dağıtalım.
6. Özet/Temizlik
Bu bölümde, uygulamayı dağıtıp amaçlandığı şekilde ve yansıtılan herhangi bir çıkışta çalıştığını doğrulayarak bu codelab'i özetledik. Uygulama doğrulamasından sonra temizlik adımlarını uygulayın ve sonraki adımları değerlendirin.
Uygulamayı dağıtma ve doğrulama
Uygulamanızı gcloud app deploy
ile yeniden dağıtın ve uygulamanın çalıştığını onaylayın. Kodunuz artık FINISH (Modül 12 klasörü) ile eşleşmelidir. Çıkış, daha önce dağıttığınız Modül 1 uygulamasıyla aynı olmalıdır:
Tüm çalışmalarımız, aynı kullanıcı için kullanıcı deneyimini hızlandırmaktı. Alan yenilendiğinde, sonuçları doğrudan önbellekten almanız gerekir. Bu işlem, yeni ziyaret oluşturmaz veya Datastore getirme işlemi gerçekleştirmez.
Örnek uygulamamıza App Engine memcache
hizmetinin kullanımını ekleyerek Modül 12 codelab'ini tamamladığınız için tebrikler. Artık bonus adımda bu Python 2 uygulamasını Python 3'e taşıyabilirsiniz.
Temizleme
Genel
Şimdilik işiniz bittiyse faturalandırılma olmaması için App Engine uygulamanızı devre dışı bırakmanızı öneririz. Bununla birlikte, daha fazla test veya deneme yapmak isterseniz App Engine platformunun ücretsiz bir kotası vardır ve bu kullanım katmanını aşmadığınız sürece sizden ücret alınmaz. Burası işlem içindir, ancak ilgili App Engine hizmetleri için de ücret alınabilir. Daha fazla bilgi için fiyatlandırma sayfasına göz atın. Bu taşıma işlemi başka Cloud hizmetlerini içeriyorsa bunlar ayrı olarak faturalandırılır. Her iki durumda da (geçerliyse) "Bu codelab'e özel" bölümünü inceleyin bölümüne bakın.
Ayrıntılı açıklama için, App Engine gibi Google Cloud sunucusuz bilgi işlem platformuna dağıtım yapmak küçük derleme ve depolama maliyetleri gerektirir. Cloud Build'in ve Cloud Storage'ın kendi ücretsiz kotası vardır. Söz konusu resmin depolanması bu kotanın bir kısmını kullanır. Ancak, bu kadar ücretsiz katmanın olmadığı bir bölgede yaşıyor olabilirsiniz. Bu nedenle, olası maliyetleri en aza indirmek için depolama alanı kullanımınız konusunda dikkatli olun. Belirli Cloud Storage "klasörleri" şunları incelemeniz gerekir:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
- Yukarıdaki depolama alanı bağlantıları
PROJECT_ID
ve *LOC
*ifadenize bağlıdır (örneğin, "us
") Uygulamanız ABD'de barındırılıyorsa.
Öte yandan, bu uygulamayı veya diğer ilgili taşıma codelab'lerini kullanmayacak ve her şeyi tamamen silmek istiyorsanız projenizi kapatın.
Bu codelab'e özel
Aşağıda listelenen hizmetler bu codelab'e özeldir. Daha fazla bilgi için her ürünün belgelerine bakın:
- App Engine Memcache hizmeti, her biri kendi fiyatlandırma yapısına sahip iki farklı türde sunulur. Bu nedenle, faturalandırma bağlamında kullanımı takip etmeniz gerekir.
- App Engine Datastore hizmeti, aynı zamanda ücretsiz bir katmana sahip olan Cloud Datastore (Data Store modunda Cloud Firestore) tarafından sağlanır; Daha fazla bilgi için fiyatlandırma sayfasını inceleyin.
Sonraki adımlar
Dikkate alınması gereken bir sonraki mantıksal taşıma işlemi, geliştiricilere App Engine memcache
hizmetinden Cloud Memorystore'a nasıl geçiş yapılacağını gösteren Modül 13'te ele alınmıştır. Bu taşıma işlemlerinin tümü isteğe bağlıdır ve uygulamalarını modernleştirmek için çeşitli adımlar uygulamak isteyen kullanıcılar tarafından kullanılabilir. Cloud Memorystore hizmeti, birçok nedenden dolayı App Engine'in memcache
sürümüne yapılan önemli bir yükseltmedir:
- Cloud Memorystore, sunucusuz değildir. Bu, önbellek için bir sunucu ayırmanız gerektiği anlamına gelir. Cloud Memorystore'un ücretsiz katmanı da yoktur. Bu faktörlerin her ikisi de maliyeti önemli ölçüde etkileyebilir.
- Cloud Memorystore, bir çift farklı temel depolama mekanizması (önbelleğe alma motorları), Redis ve Memcached'i destekler.
- Cloud Memorystore (Redis için), App Engine Memcache'den çok daha zengin ve kapsamlı bir özellik grubuna sahiptir.
- Cloud Memorystore'u kullanmak için Cloud Memorystore sunucusu kurmanız, bu sunucuyu bir Google Cloud VPC ağına eklemeniz ve ardından App Engine uygulamanızın Memorystore sunucunuzla iletişim kurmak için bu ağı kullanmasını sağlamanız gerekir.
Cloud Memorystore'un tüm özelliklerine ihtiyacınız olmadığını düşünmüyor veya maliyet üzerindeki etkilerini düşünmüyorsanız App Engine Memcache kullanmaya devam edebilirsiniz.
Modül 13'ün ötesinde, Cloud NDB ve Cloud Datastore veya Cloud Tasks gibi diğer olası taşıma işlemlerinin tümü yer alır. Ayrıca Cloud Run ve Cloud Functions'a ürünler arası taşıma işlemleri de yapılabilir. Hepsini taşıma deposunda bulabilirsiniz.
Sonraki olası bir sonraki adım, Python 3'e taşıma işlemidir. Bu işlem, isteğe bağlı bir adım olarak bir sonraki bölümde ele alınacaktır.
7. BONUS: Python 3'e geçiş
Genel Bakış
Bu bölüm, yukarıda az önce işleyeceğimiz Modül 12 uygulamasını Python 3'e taşımaya yönelik isteğe bağlı bonus içeriklerden oluşur. Yapılandırmayla başlayıp uygulama ile devam ederiz.
app.yaml'yi basitleştirin
Python 3 çalışma zamanının avantajlarından biri, app.yaml
kodunun önemli ölçüde basitleştirilebilmesidir.
ÖNCE:
12. Modül'ün sonucunda app.yaml
içinde neler olduğu aşağıda belirtilmiştir:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
Python 3 çalışma zamanı, kendi yönlendirmesini yapması için web çerçevelerinin kullanılmasını gerektirdiğinden app.yaml
içindeki tüm rota işleyicilerin auto
olarak değiştirilmesi gerekir. Statik dosya sunulmuyorsa kullanıcılar handlers:
bölümünün tamamını doğrudan kaldırabilir. Ayrıca, threadsafe
ve api_version
desteği sonlandırıldı.
SONRA:
Az önce açıklanan gerekli değişikliklerle birlikte, Python 3'ün yerini alacak olan app.yaml
aşağıda verilmiştir:
runtime: python39
app_engine_apis: true
Açıklama gerektiren tek satır: app_engine_apis: true
. Eski App Engine hizmetleri 2021'de ikinci nesil çalışma zamanlarında kullanıma sunulduğunda, Python 3 gibi bazı çalışma zamanları bu API'lere erişmek için ek önyükleme gerektirir: ndb
, taskqueue
ve memcache
. Yapılandırmadaki bu satır bu amaca hizmet eder.
Demand.txt dosyasını güncelle
requirements.txt
ürününde, orijinal API'lerin başka bir önyüklemesi yapılmalıdır: Yeni App Engine SDK'sına erişim dahil edilmelidir.
ÖNCE:
12. Modül'ün sonucunda app.yaml
içinde neler olduğu aşağıda belirtilmiştir:
flask
SONRA:
App Engine Python SDK'sını eklediğinizde şöyle olur:
flask
appengine-python-standard
appengine_config.py ve lib'yi sil
Yeni nesil App Engine çalışma zamanları, üçüncü taraf paket kullanımını yeniliyor:
- Yerleşik kitaplıklar, büyük olasılıkla geliştiricilerin buluta dağıtmasına izin verilmeyen C/C++ kodunu içermeleri nedeniyle Google tarafından incelenip App Engine sunucularında kullanıma sunulanlardır. Bu kitaplıklar artık 2. nesil çalışma zamanlarında kullanılamamaktadır.
- 2. nesil çalışma zamanlarında yerleşik olmayan kitaplıkların (bazen "tedarikçi firma" veya "kendi kendine paketleme" olarak da adlandırılır) kopyalanmasına artık gerek yoktur. Bunun yerine, derleme sistemi dağıtım sırasında bunları sizin adınıza otomatik olarak yüklediği
requirements.txt
konumunda listelenir.
Üçüncü taraf paket yönetiminde yapılan değişiklikler nedeniyle appengine_config.py
dosyasına veya lib
klasörüne ihtiyaç duyulmadığı için bunları silin. 2. nesil çalışma zamanlarında App Engine, requirements.txt
konumunda listelenen üçüncü taraf paketleri otomatik olarak yükler. Özetleniyor:
- Gruplandırılmış veya kopyalanmış üçüncü taraf kitaplıklar olmamalıdır;
requirements.txt
içinde listele lib
klasöründepip install
yok, yanilib
klasör dönemi yokapp.yaml
bölgesinde yerleşik üçüncü taraf kitaplıkları listelenmez (dolayısıylalibraries
bölümü yoktur);requirements.txt
içinde listele- Uygulamanızda referansta bulunulacak 3. taraf kitaplık olmadığında
appengine_config.py
dosyası olmaz
requirements.txt
ürününde istenen tüm üçüncü taraf kitaplıkların listelenmesi tek geliştirici gereksinimidir.
Uygulamayı App Engine SDK'yı kullanacak şekilde güncelleyin
Yukarıda belirtildiği gibi, Python 3 uygulamalarında App Engine paket hizmetlerine erişim için bazı değişiklikler yapılması gerekir:
- App Engine SDK'sı paketi (
requirements.txt
sürümünde) - App Engine SDK'sını etkinleştirin (
app.yaml
sürümünde) - WSGI nesnesini sarmala (
main.py
içinde)
İlk çift yukarıda tamamlandığından, son şart main.py
güncellemesinin yapılmasıdır.
ÖNCE:
Modül 12'nin sonunda yer alan Python 2 main.py
aşağıda verilmiştir:
from flask import Flask, render_template, request
from google.appengine.api import memcache
from google.appengine.ext import ndb
app = Flask(__name__)
HOUR = 3600
SONRA:
Python 3 bağlantı noktası için SDK'yı içe aktarın ve Flask uygulama nesnesini bununla (SDK sarmalayıcı) sarmalayarak şu sonuçları elde edin:
from flask import Flask, render_template, request
from google.appengine.api import memcache, wrap_wsgi_app
from google.appengine.ext import ndb
app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
HOUR = 3600
Paket halinde sunulan hizmetlere erişmek için geliştiricilerin, 2.x'ten 3.x'e taşıma yaparken Python uygulamalarında bu değişiklikleri yapması gerekir. Flask kullanmıyorsanız Dokümanlarda Django ve Piramid örnekleri de mevcuttur. Python 2 kodunuz bir web uygulaması değilse Python 3'e taşıma işlemi için SDK paketini eklemeniz yeterli olacaktır. Uygulama kodumuz aslında Python 2 ve 3 ile çalışacak şekilde tasarlandığından, uyumluluk konusunda ek değişikliğe gerek yoktur.
Uygulamayı dağıtma
Yukarıdaki değişiklikleri tamamladıktan sonra güncellenmiş örnek uygulamayı dağıtabilirsiniz. (Uygulamanızın Python 3 sürümünü aynı GCP projesinde orijinal bir Python 2 sürümüne dağıtırken sorun yaşamazsınız.) Uygulama davranışı aynı kalmalıdır. Güncellenen uygulamanızı bizim uygulamamızla karşılaştırmanız gerekirse taşıma deposundaki Modül 12b klasörüne bakın. Python 3 gibi en yeni çalışma zamanlarında App Engine paket hizmetlerinin desteklenmesi hakkında daha fazla bilgi edinmek için özellik lansmanı duyurusunu ve Modül 17 codelab'ini inceleyin.
Tebrikler, Modül 12'deki bonus adımı tamamladınız. Python 3 çalışma zamanı için yapılandırma dosyalarını hazırlamayla ilgili belgelere de bakın. Sonraki adımlar ve temizlik için yukarıdaki Özet/Temizlik bölümünü inceleyin.
8. Ek kaynaklar
Aşağıda, geliştiricilerin bu veya ilgili Taşıma Modülü'nü ve ilgili ürünleri daha ayrıntılı bir şekilde inceleyen ek kaynaklar verilmiştir. Bu bölümde, söz konusu içerikle ilgili geri bildirimde bulunabileceğiniz yerler, kod bağlantıları ve yararlı bulabileceğiniz çeşitli belgeler yer alır.
Codelab sorunları/geri bildirimi
Bu codelab'de herhangi bir sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama ve yeni sayı oluşturma bağlantıları:
Taşıma kaynakları
Modül 2 (START) ve Modül 12 (FINISH) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bunlara tüm App Engine codelab taşıma işlemleri için depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası indirebilirsiniz.
Codelab | Python 2 | Python 3 |
kod (bu eğiticide ele alınmamıştır) | ||
Modül 12 (bu codelab) |
Online referanslar
Aşağıda, bu eğitim için alakalı olabilecek çevrimiçi kaynaklar verilmiştir:
App Engine
- App Engine belgeleri
- Python 2 App Engine (standart ortam) çalışma zamanı
- Python 3 App Engine (standart ortam) çalışma zamanı
- Python 2 ile Python 2 arasındaki farklar 3 App Engine (standart ortam) çalışma zamanı
- Python 2'den 3'e App Engine (standart ortam) taşıma kılavuzu
- App Engine fiyatlandırması ve kota bilgileri
- İkinci nesil App Engine platformunun kullanıma sunulması (2018)
- Birinci ve ikinci nesil platformlar
- Eski çalışma zamanları için uzun süreli destek
- Belge taşıma örnekleri deposu
- Topluluğun katkıda bulunduğu taşıma örnekleri deposu
Cloud Memorystore ve Cloud Datastore
- Cloud Memorystore ürün sayfası
- Redis için Cloud Memorystore belgeleri
- Cloud Memorystore for Memcached belgeleri
- Cloud Memorystore (Redis için) fiyat bilgileri
- Cloud Datastore belgeleri
- Cloud Datastore fiyatlandırma bilgileri
Diğer Cloud bilgileri
- Google Cloud Platform'da Python
- Google Cloud Python istemci kitaplıkları
- Google Cloud "Daima Ücretsiz" katman
- Google Cloud SDK'sı (
gcloud
komut satırı aracı) - Tüm Google Cloud belgeleri
Videolar
- Sunucusuz Taşıma İstasyonu
- Sunucusuz Keşif Seferleri
- Google Cloud Teknolojisi'ne abone olun
- Google Developers'a abone olun
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.