Program
Veri bilimciler olarak genelde dağıtım ve bakım süreçlerine dahil olmayız—istatistiksel modelleri kurarız, geri kalanını mühendisler halleder.
Ancak, işler değişmeye başladı!
Model oluşturma ile üretim ortamı arasındaki boşluğu kapatabilen veri bilimcilere olan talep arttıkça, otomasyon ve CI/CD (Sürekli Entegrasyon/Sürekli Teslimat) araçlarına aşina olmak stratejik bir avantaj sağlayabilir.
Bu eğitimde, iki popüler otomasyon aracını öğreneceğiz: Make (yerel otomasyon) ve GitHub Actions (bulut tabanlı otomasyon). Ana odağımız bu araçları veri projelerimize dahil etmek olacak.

GitHub Action ve Make. Görsel: Abid Ali Awan.
Veri bilimi bağlamında otomasyon hakkında daha fazla bilgi edinmek isterseniz, şu kursa göz atın: Fully Automated MLOps.
MakeFile’a Giriş
Makefile, yazılım projelerini oluşturmak ve yönetmek için bir plandır. Görevleri otomatikleştirmek, karmaşık derleme süreçlerini basitleştirmek ve tutarlılığı sağlamak için komutlar içeren bir dosyadır.
Makefile içindeki komutları yürütmek için make komut satırı aracını kullanırız. Bu araç, Python programı gibi argümanlar verilerek veya tek başına çalıştırılabilir.
Temel bileşenler
Bir Makefile genellikle hedefler, bağımlılıklar, eylemler ve değişkenlerden oluşur:
- Hedef: "build", "test" veya "clean" gibi istenen sonuçlardır. Bunları Makefile aracılığıyla ulaşmak istediğiniz hedefler olarak hayal edin.
- Bağımlılıklar: Hedefi oluşturmak için gereken dosyalardır. Her tarif (hedef) için gereken malzemeler gibi düşünebilirsiniz.
- Eylemler: Sisteme hedefin nasıl oluşturulacağını söyleyen talimatlar veya betiklerdir.
python test.pygibi komutlar içerebilirler. - Değişkenler: Makefile’lar, eylemlere iletilen argümanlar gibi davranan genel değişkenler sağlar. Yukarıdaki eylem örneğini kullanarak,
python test.py $variable_1 $variable_2kullanabilirdik.
Kısacası, bir MakeFile şablonu şöyle görünebilir:
Variable = some_value
Target: Dependencies
Actions (commands to build the target) $Variable
Yukarıdaki örneklerimizi kullanarak, MakeFile şöyle görünebilir:
# Define variables
variable_1 = 5
variable_2 = 10
# Target to run a test with variables
test: test_data.txt # Dependency on test data file
python test.py $variable_1 $variable_2
Make CLI Aracını Yükleme
Make CLI aracı tüm işletim sistemlerine kurulabilir.
Linux
Linux için terminalde aşağıdaki komutu kullanmamız gerekir:
$ sudo apt install make
MacOS
macOS için make’i yüklemek üzere homebrew kullanabiliriz:
$ brew install make
Windows
Windows biraz farklıdır. Make aracı birden fazla şekilde kullanılabilir. En popüler seçenekler WSL (Ubuntu Linxus), w64devkit ve GnuWin32’dir.
SourceForge sayfasından GnuWin32’yi indirip kuralım.
Terminalde komut satırı aracı olarak kullanmak için klasörün konumunu Windows ortam değişkenine eklememiz gerekir. Şu adımları izleyebiliriz:
- Başlat menüsünde "environment variables" araması yapın—bu bizi Sistem Özellikleri penceresine yönlendirecek.
- Sistem Özellikleri penceresinde Ortam Değişkenleri düğmesine tıklayın.
- Sistem değişkenleri bölümünde "Path" değişkenini bulun ve düzenleyin—bu, Make aracı dizinine yeni yol ekleyebileceğimiz başka bir pencere açacaktır.

Make’in başarıyla kurulup kurulmadığını test etmek için PowerShell’e make -h yazabiliriz.

Bir Veri Bilimi Projesi için MakeFile Kullanma
Bu bölümde, bir veri bilimi projesinde Makefile ve Make CLI araçlarının nasıl kullanılacağını öğreneceğiz.
World Happiness Report 2023 veri setini kullanarak veri işleme, analiz ve veri özetlerini ile görselleştirmeleri kaydetmeyi ele alacağız.
Kurulum
Proje dizinine gidip Makefile-Action adlı bir klasör oluşturarak başlıyoruz. Ardından bu klasör içinde data_processing.py dosyasını oluşturup VSCode düzenleyicisini açıyoruz.
$ cd GitHub
$ mkdir Makefile-Action
$ cd .\Makefile-Action\
$ code data_processing.py
Veri işleme
Verilerimizi Python kullanarak işlemeye başlıyoruz. Aşağıdaki kod bloğunda şu adımları uyguluyoruz (not: bu örnek bir koddur—gerçek bir senaryoda muhtemelen daha fazla adım gerekir):
- Kullanıcının sağladığı dizin konumundan ham veri setini yükleyin.
- Daha iyi okunabilirlik için tüm sütunları yeniden adlandırın.
- Eksik değerleri doldurun.
- Temizlenmiş veri setini kaydedin.
Dosya: data_processing.py
import sys
import pandas as pd
# Check if the data location argument is provided
if len(sys.argv) != 2:
print("Usage: python data_processing.py <data_location>")
sys.exit(1)
# Load the raw dataset (step 1)
df = pd.read_csv(sys.argv[1])
# Rename columns to more descriptive names (step 2)
df.columns = [
"Country",
"Happiness Score",
"Happiness Score Error",
"Upper Whisker",
"Lower Whisker",
"GDP per Capita",
"Social Support",
"Healthy Life Expectancy",
"Freedom to Make Life Choices",
"Generosity",
"Perceptions of Corruption",
"Dystopia Happiness Score",
"GDP per Capita",
"Social Support",
"Healthy Life Expectancy",
"Freedom to Make Life Choices",
"Generosity",
"Perceptions of Corruption",
"Dystopia Residual",
]
# Handle missing values by replacing them with the mean (step 3)
df.fillna(df.mean(numeric_only=True), inplace=True)
# Check for missing values after cleaning
print("Missing values after cleaning:")
print(df.isnull().sum())
print(df.head())
# Save the cleaned and normalized dataset to a new CSV file (step 4)
df.to_csv("processed_data\WHR2023_cleaned.csv", index=False)
Veri analizi
Şimdi veriyi analiz etmeye devam ediyor ve tüm kodumuzu data_analysis.py adlı bir dosyaya kaydediyoruz. Bu dosyayı aşağıdaki terminal komutuyla oluşturabiliriz:
$ code data_analysis.py
echo komutunu kullanarak da Python dosyası oluşturup farklı bir kod düzenleyicide açabiliriz.
$ echo "" > data_analysis.py
Aşağıdaki kod bloğunda şunları yapıyoruz:
- Kullanıcının sağladığı girdiyi kullanarak temiz veri setini yükleyin.
- Veri özetini, veri bilgisini ve DataFrame’in ilk 5 satırını oluşturup TXT dosyasına kaydedin.
- Şunlar için görselleştirme çizin:
- Mutluluk puanlarının dağılımı
- Mutluluk puanına göre ilk 20 ülke
- Mutluluk puanı ile kişi başına GSYİH
- Mutluluk puanı ile sosyal destek
- Bir korelasyon ısı haritası
- Tüm görselleştirmeleri “figures” klasörüne kaydedin.
Dosya: data_analysis.py
import io
import sys
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
# Check if the data location argument is provided
if len(sys.argv) != 2:
print("Usage: python data_analysis.py <data_location>")
sys.exit(1)
# Load the clean dataset (step 1)
df = pd.read_csv(sys.argv[1])
# Data summary (step 2)
print("Data Summary:")
summary = df.describe()
data_head = df.head()
print(summary)
print(data_head)
# Collecting data information
buffer = io.StringIO()
df.info(buf=buffer)
info = buffer.getvalue()
## Write metrics to file
with open("processed_data/summary.txt", "w") as outfile:
f"\n## Data Summary\n\n{summary}\n\n## Data Info\n\n{info}\n\n## Dataframe\n\n{data_head}"
print("Data summary saved in processed_data folder!")
# Distribution of Happiness Score (step 3)
plt.figure(figsize=(10, 6))
sns.displot(df["Happiness Score"])
plt.title("Distribution of Happiness Score")
plt.xlabel("Happiness Score")
plt.ylabel("Frequency")
plt.savefig("figures/happiness_score_distribution.png")
# Top 20 countries by Happiness Score
top_20_countries = df.nlargest(20, "Happiness Score")
plt.figure(figsize=(10, 6))
sns.barplot(x="Country", y="Happiness Score", data=top_20_countries)
plt.title("Top 20 Countries by Happiness Score")
plt.xlabel("Country")
plt.ylabel("Happiness Score")
plt.xticks(rotation=90)
plt.savefig("figures/top_20_countries_by_happiness_score.png")
# Scatter plot of Happiness Score vs GDP per Capita
plt.figure(figsize=(10, 6))
sns.scatterplot(x="GDP per Capita", y="Happiness Score", data=df)
plt.title("Happiness Score vs GDP per Capita")
plt.xlabel("GDP per Capita")
plt.ylabel("Happiness Score")
plt.savefig("figures/happiness_score_vs_gdp_per_capita.png")
# Visualize the relationship between Happiness Score and Social Support
plt.figure(figsize=(10, 6))
plt.scatter(x="Social Support", y="Happiness Score", data=df)
plt.xlabel("Social Support")
plt.ylabel("Happiness Score")
plt.title("Relationship between Social Support and Happiness Score")
plt.savefig("figures/social_support_happiness_relationship.png")
# Heatmap of correlations between variables
corr_matrix = df.drop("Country", axis=1).corr()
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", square=True)
plt.title("Correlation Heatmap")
plt.savefig("figures/correlation_heatmap.png")
print("Visualizations saved to figures folder!")
Makefile oluşturma
Bir Makefile oluşturmadan önce, yeni bir makinede gerekli tüm Python paketlerini kurmak için bir requirements.txt dosyası hazırlamamız gerekir. requirements.txt dosyası şöyle görünecektir:
pandas
numpy
seaborn
matplotlib
black
Makefile’ımız değişkenler, bağımlılıklar, hedefler ve eylemlerden oluşuyor—tüm yapı taşlarını öğreneceğiz. Makefile adlı bir dosya oluşturuyor ve hedefler için eylemleri eklemeye başlıyoruz:
- install: pip sürümünü yükseltir ve requirements.txt dosyasını kullanarak gerekli tüm Python paketlerini yükler.
- format: Tüm Python dosyalarını Black aracıyla biçimlendirir.
- process: `data_processing.py` Python dosyasını, değişken ve bağımlılık olarak ham veri yolu ile çalıştırır.
- analyze: `data_analysis.py` Python dosyasını, değişken ve bağımlılık olarak işlenmiş veri yolu ile çalıştırır.
- clean: Python dosyalarını çalıştırırken üretilen tüm dosya ve görselleri kaldırır.
- all: Geçerli tüm hedefleri sırayla çalıştırır.
Dosya: Makefile
RAW_DATA_PATH = "raw_data/WHR2023.csv"
PROCESSED_DATA = "processed_data/WHR2023_cleaned.csv"
install:
pip install --upgrade pip &&\
pip install -r requirements.txt
format:
black *.py --line-length 88
process: ./raw_data/WHR2023.csv
python data_processing.py $(RAW_DATA_PATH)
analyze: ./processed_data/WHR2023_cleaned.csv
python data_analysis.py $(PROCESSED_DATA)
clean:
rm -f processed_data/* **/*.png
all: install format process analyze
Hedefi yürütmek için terminalde make aracını kullanıp hedef adını vereceğiz.
$ make format
Black betiği başarıyla çalıştı.

Veri işleme için Python betiğini çalıştırmayı deneyelim.
Önemli bir not: process hedefini çalıştırmadan önce hedef bağımlılıklarını kontrol eder. Bizim durumumuzda, ham veri dosyasının var olup olmadığını denetler. Yoksa komut başlatılmaz.
$ make process
Görüldüğü gibi bu kadar basit.

make komutuna ek bir argüman sağlayarak mevcut değişkeni bile geçersiz kılabilirsiniz.
Bizim örneğimizde ham verinin yolunu değiştirdik.
$ make process RAW_DATA_PATH="WHR2022.csv"
Python betiği farklı bir giriş argümanıyla çalıştı.

Tüm iş akışını otomatikleştirmek için, hedef olarak all kullanacağız; bu hedef, install, format, process ve analyze hedeflerini tek tek çalıştırır.
$ make all
make komutu Python paketlerini kurdu, kodu biçimlendirdi, veriyi işledi ve özet ile görselleştirmeleri kaydetti.


make all komutunu çalıştırdıktan sonra proje dizininiz şöyle görünmelidir:

GitHub Actions’a Giriş
Make, geliştirme ortamımızda yerel otomasyonda başarılı olurken, GitHub Actions bulut tabanlı bir alternatif sunar.
GitHub Actions genellikle CI/CD için kullanılır; bu sayede geliştiriciler uygulamayı doğrudan GitHub’dan derleyebilir, inşa edebilir, test edebilir ve üretime dağıtabilir.
Örneğin, push veya pull request gibi belirli olaylara göre tetiklenecek özel bir iş akışı oluşturabiliriz. Bu iş akışı kabuk betikleri ve Python betiklerini çalıştırır; hatta önceden oluşturulmuş eylemleri de kullanabiliriz. Özel iş akışı bir YML dosyasıdır ve genellikle anlaşılması ve özel çalıştırmalar ile eylemler yazmaya başlamak oldukça kolaydır.
Temel bileşenler
GitHub Actions’ın temel bileşenlerini inceleyelim:
- Workflows, hangi adımların yürütüleceğini ve hangi koşullarda yürütüleceğini belirleyen YML dosyalarıyla tanımlanır.
- Events, push, pull_request, schedule ve daha fazlası gibi bir iş akışını tetikleyen belirli etkinliklerdir.
- Runners, iş akışları tetiklendiğinde bunları çalıştıran makinelerdir. GitHub, Linux, Windows ve macOS için barındırılan, ücretsiz runner’lar sağlar.
- Jobs, aynı runner üzerinde yürütülen bir dizi adımdır. Varsayılan olarak işler paralel çalışır, ancak sıralı çalışacak şekilde yapılandırılabilir.
- Steps, Makefile eylemlerine benzer şekilde komutları veya eylemleri çalıştıran görevlerdir.
- Actions, karmaşık ancak sık tekrarlanan bir görevi yerine getiren, GitHub Actions platformu için özel uygulamalardır. Çoğu açık kaynak topluluğu tarafından desteklenen çok sayıda eylem mevcuttur.
GitHub Actions ile Başlarken
Bu bölümde, GitHub Actions kullanmayı öğrenecek ve daha önce Makefile’da kullandığımız komutları kopyalamaya çalışacağız.
Kodumuzu GitHub’a aktarmak için, proje klasörümüzü şu komutla bir Git deposuna çevirmemiz gerekir:
$ git init
Ardından GitHub’da yeni bir depo oluşturup URL’yi kopyalarız.

Terminalde aşağıdaki komutları yazarak şunları yaparız:
- Uzak depo bağlantısını ekleyin.
- Uzak depodan dosyaları çekin.
- Tüm dosyaları bir commit mesajıyla ekleyip commit’leyin.
- Yerelden
masterdalını uzakmaindalına itin.
$ git remote add github https://github.com/kingabzpro/Makefile-Actions.git
$ git pull github main
$ git add .
$ git commit -m "adding all the files"
$ git push github master:main
Yan not olarak, GitHub veya Git hakkında kısa bir hatırlatmaya ihtiyacınız olursa, başlangıç dostu şu eğitime göz atın: GitHub ve Git. Bu, veri bilimi projenizi sürümlendirmenize ve Git CLI aracıyla ekibinizle paylaşmanıza yardımcı olur.
Derse devam edelim—tüm dosyaların başarıyla uzak depoya aktarıldığını görüyoruz.

Sırada bir GitHub Action iş akışı oluşturmak var. Önce depomuzun Actions sekmesine gidiyoruz: kingabzpro/Makefile-Actions. Ardından mavi renkteki “set up a workflow yourself.” metnine tıklıyoruz.

Ortamı kurmak ve komutları yürütmek için tüm kodu yazacağımız YML dosyasına yönlendirileceğiz. Şunları yapacağız:
- İş akışının adını verin.
maindalına kod itildiğinde veyamaindalına pull request açıldığında iş akışını çalıştıracak tetikleyici olayları ayarlayın.- En güncel Ubuntu Linux makinesiyle bir iş ayarlayın.
- Adımlar bölümünde checkout v3 eylemini kullanın. Bu, iş akışımızın depolara erişmesine yardımcı olur.
- Gerekli Python paketlerini yükleyin, kodu biçimlendirin ve iki Python betiğini de değişkenlerle çalıştırın.
name: Data Processing and Analysis
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Packages
run: |
pip install --upgrade pip
pip install -r requirements.txt
- name: Format
run: black *.py --line-length 88
- name: Data Processing
env:
RAW_DATA_DIR: "./raw_data/WHR2023.csv"
run: python data_processing.py $RAW_DATA_DIR
- name: Data Analysis
env:
CLEAN_DATA_DIR: "./processed_data/WHR2023_cleaned.csv"
run: python data_analysis.py $CLEAN_DATA_DIR
İş akışı dosyasını bir mesajla commit’ledikten sonra iş akışı otomatik olarak çalışmaya başlayacaktır.

Tüm adımların bitmesi en az 20 saniye sürecektir.
Günlükleri kontrol etmek için önce iş akışı çalıştırmasına, sonra Build düğmesine ve ardından günlükleri görmek için her işe tıklarız.

Bu hoşunuza gittiyse, temel bir makine öğrenmesi iş akışını kurma ve otomatikleştirmeyi ele alan şu içeriği seveceksiniz: Beginner's Guide to CI/CD for Machine Learning.
GitHub Actions’ı MakeFile ile Birleştirme
GitHub Action iş akışlarını basitleştirmek ve standartlaştırmak için geliştiriciler iş akışı dosyası içinde Make komutlarını kullanır. Bu bölümde, Make komutunu kullanarak iş akışı kodumuzu nasıl basitleştireceğimizi ve continuous machine learning (CML) eylemini nasıl kullanacağımızı öğreneceğiz.
Başlamadan önce, iş akışı dosyasını uzak depodan çekmemiz gerekiyor.
$ git pull
CML kullanımı
Continuous Machine Learning (CML), iterative.ai tarafından geliştirilen ve veri bilimi projemize sürekli entegrasyon uygulamamıza olanak tanıyan açık kaynaklı bir kütüphanedir.
Bu projede, iş akışında CML fonksiyonlarını kullanan ve şekiller ile veri istatistiklerini kullanarak analiz raporu üreten iterative/setup-cml GitHub Action’ını kullanacağız.
Rapor oluşturulacak ve birleştirmeden önce ekibimizin inceleyip onaylaması için GitHub commit’imize eklenecek.
Makefile’ı değiştirecek ve “summary” adlı başka bir hedef ekleyeceğiz. Dikkat edin:
- Hedef, summary.txt içindeki metin verisini report.md’ye aktaran çok satırlı bir betiktir.
- Ardından, her bir şekil için başlıkları ve report.md dosyasında şekli gösterecek Markdown kodunu tek tek ekler.
- En sonunda,
cmlaracını kullanarak bir veri analizi raporu oluşturacak ve bunu commit yorumlarının altında göstereceğiz.
GitHub iş akışı dosyasına bu kadar çok satır eklediğinizi hayal edin—okuması ve değiştirmesi zor olurdu. Bunun yerine make summary kullanacağız.
Dosya: Makefile
summary: ./processed_data/summary.txt
echo "# Data Summary" > report.md
cat ./processed_data/summary.txt >> report.md
echo '\n# Data Analysis' >> report.md
echo '\n## Correlation Heatmap' >> report.md
echo '' >> report.md
echo '\n## Happiness Score Distribution' >> report.md
echo '' >> report.md
echo '\n## Happiness Score vs GDP per Capita' >> report.md
echo '' >> report.md
echo '\n## Social Support vs Happiness Relationship' >> report.md
echo '' >> report.md
echo '\n## Top 20 Countries by Happiness Score' >> report.md
echo '' >> report.md
cml comment create report.md

GiHub Action dosyasını değiştirme
.github/workflows dizininde bulunan main.yml dosyamızı şimdi düzenleyeceğiz.
Tüm komutları ve Python betiklerini make komutuyla değiştiriyor ve CML Action’ın commit yorumunda veri raporu oluşturmasına izin veriyoruz. Ek olarak, iterative/setup-cml@v3 Action’ını çalıştırmamıza eklemeyi unutmadığımızdan emin olalım.
name: Data Processing and Analysis
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions: write-all
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: iterative/setup-cml@v3
- name: Install Packages
run: make install
- name: Format
run: make format
- name: Data Processing
env:
RAW_DATA_DIR: "./raw_data/WHR2023.csv"
run: make process RAW_DATA_PATH=$RAW_DATA_DIR
- name: Data Analysis
env:
CLEAN_DATA_DIR: "./processed_data/WHR2023_cleaned.csv"
run: make analyze PROCESSED_DATA=$CLEAN_DATA_DIR
- name: Data Summary
env:
REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: make summary
İş akışını çalıştırma
İş akışını yürütmek için yalnızca tüm değişiklikleri commit’leyip uzak main dalıyla senkronize etmemiz yeterlidir.
$ git commit -am "makefile and github action combo"
$ git push github master:main

İş akışının çalışması 32 saniye sürdü—raporumuz incelemeye hazır. Bunun için build özetine gidiyor, Data Summary sekmesine tıklıyor ve ardından yorum bağlantısına tıklıyoruz (aşağıdaki görselde satır 20’de gördüğünüz bağlantı):

Gördüğünüz gibi, veri özeti ve veri görselleştirmeleri commit’imize eklenmiş durumda.

Proje kingabzpro/Makefile-Actions üzerinde mevcut; takıldığınızda rehber olarak kullanabilirsiniz. Depo herkese açık, bu yüzden forklayın ve sihri kendiniz deneyimleyin!
GitHub sertifikası almak ister misiniz? Farklı GitHub sertifikaları hakkında kapsamlı rehberimize göz atın!
Sonuç
Bu eğitimde, veri analitik raporlarının üretimini otomatikleştirmek için Makefile ve GitHub Actions’a odaklandık.
Ayrıca iş akışını nasıl kurup çalıştıracağımızı ve otomasyon sürecini optimize edip basitleştirmek için GitHub iş akışı içinde Make aracını nasıl kullanacağımızı öğrendik. Birden fazla satır kod yazmak yerine, commit’imize eklenecek bir veri analizi raporu üretmek için make summary kullanabiliriz.
Veri bilimi için CI/CD konusunda ustalaşmak istiyorsanız, şu kursu deneyin: CI/CD for Machine Learning. Bu kurs, CI/CD’nin temellerini, GitHub Actions’ı, veri sürümlendirmeyi ve model hiperparametre optimizasyonu ile değerlendirmesini otomatikleştirmeyi kapsar.
Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.

