Yazılım geliştirici

Ersan
Çolak.

Her şey bir olay: servisler olay üretir, olaylar sırayla günlüğe yazılır, her tüketici kendi hızında okur. Kaydırdıkça geçmiş yeniden oynatılır.

Kaydır, geçmişi yeniden oynat
Soru · cevap

Bana
sor.

Bu kart, sitedeki projelerim üzerinde çalışan küçük bir yerel model. Bir soru seç.

ersan.local · qwen2.5 · çevrimdışı— tok/sn
Merhaba

Ben Ersan. Dağıtık .NET sistemleri, veri hatları ve makine öğrenmesi üzerine çalışıyorum: olay kaynaklı mimari ve CQRS, outbox ile güvenilir mesajlaşma, PostgreSQL satır güvenliğiyle çok kiracılık, SignalR ile gerçek zamanlı yayın, kantar, bariyer ve plaka tanıma gibi saha donanımıyla konuşan kapı otomasyonu, EDIFACT ve TOS entegrasyonları, gradyan artırmalı ağaçlar, sağlam istatistik ve Isolation Forest ile anomali tespiti, tamamen yerel çalışan RAG ve ajan sistemleri. Bunların çoğu konteyner terminallerinde, canlı operasyon verisi üzerinde çalışıyor.

Mimari
Event sourcingCQRS, outbox, NATS, gRPC, mikroservis
Sunucu
.NET 10ASP.NET Core, ServiceStack, SignalR, linq2db, Python
Veri
PostgreSQLRLS, pgvector, TimescaleDB, SQL Server, Elasticsearch
ML ve LLM
ML.NET · OllamaFastTree, RandomizedPCA, Isolation Forest, scikit-learn, RAG
Entegrasyon
Navis N4 · SAPEDIFACT, BİLGE, Modbus TCP, OPC UA, SOAP, SFTP

Projeler.

Her proje günlüğe düşmüş bir kayıt. İçinde ne iş yaptığından çok nasıl yapıldığı yazıyor: mimari, algoritma ve ölçülerek verilmiş tasarım kararları.

Günlük 16 kayıtYapay zekâ 6Saha ve donanım 3Entegrasyon ve gerçek zaman 7
Olay günlüğü · her proje bir kayıtDurum

01Yapay zekâ

#0001ModelsRetrained
streamml.yard
durumCanlı veride pilot
yığın.NET 10 · ML.NET · ServiceStack
teknik6 kayıt
Canlı veride pilotML servisi · operasyon verisi

Saha verimliliği ve anomali tespiti

Terminal veritabanındaki hareket ve birim kayıtlarından verimsizliği, riski ve olağan dışı durumları çıkaran ML servisi ve panosu.

Gradyan artırma
ML.NET FastTree ile bekleme süresi regresyonu ve yer değiştirme riski sınıflandırması.
Gözetimsiz anomali
RandomizedPCA yeniden kurma hatası, yüzdelik dilim kalibrasyonuyla skora çevriliyor.
Sürekli eğitim
Her gece 180 günlük pencereden yeniden eğitim; eğitim geçmişi ve model sağlığı raporu, model yoksa açılışta eğitim.
Özellik deneyi
A/B testinde alıcı geçmişi özellikleri bekleme modelinde R²’yi 0,28’den 0,38’e çıkardı.
Sıralı kurallar
Yer değiştirmeler 7 öncelikli kuralla zorunlu ya da önlenebilir diye ayrılıyor, maliyet mesafe ve ekipman süresinden hesaplanıyor.
Veri dürüstlüğü
Geride kalan okuma replikası algılanıp “şimdi” son veri anına sabitleniyor; veri kalitesi sessizce değil raporla düşüyor.
risk modeli, canlı veri
AUC 0,76
konteyner, 180 gün
~170 bin
gece eğitim süresi
~2,5 dk
.NET 10ML.NETServiceStackReact 19Recharts
#0002AnomalyRaised
streamml.moves
durumGeliştirmede
yığınPython · scikit-learn · FastAPI
teknik6 kayıt
GeliştirmedeSağlam istatistik · Isolation Forest

Terminal hareketlerinde anomali tespiti

TOS hareket kayıtlarından bekleme, gereksiz yer değiştirme ve vinç plan sapmalarını yakalayıp alarm üreten, alarmı yerel modelle açıklayan sistem.

Üretimi yormayan ETL
Kaynak veritabanından watermark ile artımlı, 50 binlik partilerle çekim; idempotent yükleme ve veri kalitesi kontrolleri.
Segment bazlı normal
Her segmentin kendi profili: medyan ve MAD ile sağlam z-skor, çarpık dağılımlarda yüzdelik tabanlı şiddet; az örnekli segment güvenilmez işaretleniyor.
Çok değişkenli
Segment başına Isolation Forest, tek tek normal görünen ama birlikte anormal olan vakaları arıyor.
Alarm yorgunluğu
Bakım pencereleri ve tekrarlayan molalar, gece yarısını aşanlar dahil, alarmı bastırıyor; operatör geri bildirimi kaydediliyor.
Açıklayan LLM
Karar istatistikte. Yerel LLM yalnızca ilgili prosedür, benzer geçmiş olaylar ve birimin hareket geçmişiyle açıklama yazıyor.
Geriye dönük test
Altı metriğin her biri ayrı backtest betiğiyle eşiklere karşı sınanıyor.
metrik
6
ETL partisi
50 bin
prosedür belgesi
5
Pythonscikit-learnFastAPIRedisPostgreSQLOllama
#0003VerdictComputed
streamml.desk
durumPrototip
yığın.NET 9 · Ollama · bge-m3
teknik3 kayıt
PrototipYerel LLM · RAG

Kararı LLM’e bırakmayan RAG sınıflandırıcı

Destek taleplerini kategori ve alt kategoriye ayıran, tamamen şirket içinde çalışan sınıflandırıcı.

Gömme ve arama
bge-m3 gömmeleri PostgreSQL’de kalıcı, aramada bellekte kosinüs benzerliğiyle en yakın 8 komşu.
Deterministik karar
Kararı komşuların ağırlıklı oylaması veriyor; LLM karar yolunda değil, yalnızca özet ve öncelik üretiyor.
Bilinen hata modu
Gömme tabanlı RAG “bilmiyorum” diyemez; ilgisiz konular anahtar kelime engel listesiyle önden eleniyor.
etiketli geçmiş talep
21,5 bin
kosinüs komşu
top-8
dışarı çıkan veri
0
.NET 9Ollamabge-m3qwen2.5PostgreSQL
#0004EventAppended
streamcore.events
durumGeliştirmede
yığın.NET 10 · PostgreSQL · linq2db
teknik6 kayıt
GeliştirmedeEvent sourcing · karar servisi

Olay kaynaklı, yapay zekâ çekirdekli platform

Terminalin bütün iş alanlarını tek çekirdekte toplayan, operasyon kararlarını modelin önerdiği modüler platform.

Event sourcing ve CQRS
Aylık bölümlenmiş tek olay tablosu ve aggregate baş tablosu; senkron ve asenkron projeksiyonlar ayrı.
Güvenilir yayın
Olay ve outbox kaydı aynı işlemde yazılıyor, NATS’e en az bir kez teslim ediliyor.
Çok kiracılık
PostgreSQL satır güvenliği; kiracı bağlamı istek başına SET LOCAL ile veriliyor.
Karar servisi
gRPC üzerinden öneri ve gerekçe. Operatör her zaman ezebiliyor, her ezme eğitim sinyali olarak saklanıyor.
Kural dili
Parametre ve iş kuralları EBNF ile tanımlı bir DSL’de, kodda değil.
Kimlik ve test
Zaman sıralı UUIDv7 kimlikler; entegrasyon testleri Testcontainers ile gerçek PostgreSQL’e karşı.
.NET 10PostgreSQLlinq2dbgRPCNATSTestcontainers
#0005DeviationDetected
streamplant.energy
durumTasarımda
yığınPython · TimescaleDB · OPC UA
teknik4 kayıt
TasarımdaZaman serisi · topraklanmış LLM

Proses tesisi için karar desteği

Kimya tesisinin kontrol sistemi verisinden enerji sapmasını yakalayıp nedenini anlatan sistem.

Tek yönlü veri
OPC UA toplayıcı DMZ’de, veri yalnızca dışarı itiliyor; kontrol ağına yazma yolu yok.
Zaman serisi
Tag verisi TimescaleDB’de; birim üretim başına doğalgaz sapması kurallarla tespit ediliyor.
Topraklama
LLM yanıtı yalnızca kaynak veriye referansla kabul ediliyor, dayanaksız cümle denetimden geçmiyor.
Otomatik mod yok
Sistem öneri üretir; uygulama kararı vardiya mühendisinde.
PythonTimescaleDBOPC UApgvectorOllama
#0006QuoteAudited
streamagents.procure
durumVeri analizi
yığın.NET 10 · Microsoft.Extensions.AI · Ollama
teknik4 kayıt
Veri analiziÇoklu ajan · insan onayı

Birbirini denetleyen ajanlar

Satın alma taleplerinde fiyatı, tedarikçiyi ve kararı tartan yerel ajan sistemi.

Deterministik omurga
Kural tablosu ve geçmiş veriden çıkan fiyat normları kararın iskeletini kuruyor, LLM kenarda.
Ayrık roller
Çıkarıcı (çift geçiş), kaşif, doğrulayıcı, analist ve denetçi; uyuşmazlık insana düşüyor.
Konuşmayan ajanlar
Ajanlar sohbet etmiyor, veritabanı üzerinden bağlanıyor; iş akışı motoru, kuyruk ve işçiler.
İç ajan çatısı
IAgent arayüzü, sürümlü prompt deposu, rol→model yönlendirici, çağrı günlüğü, golden set koşucusu.
.NET 10Microsoft.Extensions.AIOllamaPostgreSQL

02Saha ve donanım

#0007GateTransactionCompleted
streamgate.kiosk
durumCanlıda
yığın.NET Framework 4.8 · ServiceStack · SignalR
teknik6 kayıt
CanlıdaKural motoru · donanım · gerçek zaman

Kapı otomasyonu

Kamyonun kapıya gelişinden bariyerin açılmasına kadar insansız işleyen kapı sistemi: plaka okunur, işlem TOS’tan çekilir, kontroller yapılır, fiş basılır.

Veriyle yönetilen kurallar
Her işlem tipinin sonraki aşaması, tartım, ikiz ve çift yük kuralları, ağırlık sınırı ve fiş tipi kodda değil veritabanında; şerit yetenekleri kuralı ayrıca daraltıyor.
Yük kombinasyonları
Tekli, ikiz, çift ve çift+ikiz yükler ön kapıda doğrulanıyor: aynı yönde iki tip yok, en çok iki 20′ ya da tek 40′.
Donanım soyutlama
Kantar, bariyer, plaka tanıma, yazıcı ve kamera arayüz arkasında; şeritte bir özellik kapalıysa boş nesne enjekte ediliyor.
Kontrol odası
SignalR hub’ı kiosk ile kontrol odası arasında mesaj, yapılandırma bildirimi ve VoIP çağrı sinyalleşmesi taşıyor; mesaj geçmişi sınırlı bellek kuyruğunda.
Kesişen loglama
PostSharp aspect’i her iş metodunun süresini, plakayı, kioskı ve okuma sonucunu kuyruk ve arşiv tablosuna yazıyor.
İdempotent bildirim
Gümrüğe tek açık kayıt kuralı; konteyner listesi değişmediyse yeniden gönderilmiyor, takasta eski kayıt iptal edilip yeniden açılıyor.
aktif işlem kuralı
230
şerit
36
kamyon ziyareti / 30 gün
~25,8 bin
.NET Framework 4.8ServiceStackSignalRPostSharpSQL ServerNavis N4
#0008WeightCaptured
streamgate.hardware
durumCanlıda
yığın.NET Framework 4.8 · ServiceStack · Modbus TCP
teknik5 kayıt
CanlıdaEndüstriyel protokoller

Kapı donanım köprüsü

Kiosk yazılımının kantar, bariyer, plaka tanıma, kamera ve yazıcıyla konuştuğu tek HTTP katmanı.

Ham TCP kantar
STX ile başlayıp CR ile biten 21 baytlık çerçeve ayrıştırılıyor; 100 ms yoklama, 3 sn zaman aşımı, kantar modeline göre strateji.
Modbus TCP
Bariyer ve plaka tanıma tetiği G/Ç modülünün röle bobinleriyle sürülüyor, bariyer blokajı dijital girişten okunuyor.
Belirsiz okuma
Aynı geçişte birden fazla plaka okuması varsa sonuç belirsiz sayılıp boş dönülüyor; okuma yoksa kamera tetiklenip 2 sn sonra yeniden soruluyor.
Yapılandırmayla ölçek
Kiosk kodu ve donanım tipi bir eşleme tablosuna bağlı; yeni kantar ya da kamera eklemek yalnızca JSON değişikliği.
Çok markalı kamera
Üç üreticinin anlık görüntü uçları tek arayüzde; ön ve arka hat kamerası görüntüsü kırpılarak saklanıyor.
donanım eşlemesi
133
donanım tipi
9
kantar
20
.NET Framework 4.8ServiceStackModbus TCPTCP soket
#0009PositionBuffered
streamfleet.gps
durumTeslim edildi
yığın.NET 6 · Worker Service · LiteDB
teknik5 kayıt
Teslim edildiKenar ajanı · çevrimdışı dayanıklılık

Saha araçlarında GPS izleme

Terminal araçlarındaki GPS alıcısını seri porttan okuyan, bağlantı koptuğunda veriyi yerelde biriktiren Windows servisi ve onu karşılayan API.

Seri port akışı
Arka plan servisi baytları tamponluyor, ASCII dışını temizliyor, #…$ çerçeveli mesajı regex ile yakalayıp koordinata çeviriyor.
Çevrimdışı tampon
Noktalar gömülü LiteDB’de bekliyor; 60 saniyede bir toplu gönderiliyor, iletilenler yerelden siliniyor.
Seyreltme
Haversine mesafesiyle 5 metrenin altındaki hareketler atılıyor, aynı ekipman ve koordinat tekilleştiriliyor.
Uzaktan güncelleme
Ayrı bir güncelleyici yeni sürümü sunucudan alıp açıyor, servisi durdurup yeniden başlatıyor.
Bağlantı izleme
API sağlığı sürekli yoklanıyor, kopmalar kayda geçiyor.
seyreltme eşiği
5 m
gönderim aralığı
60 sn
.NET 6Worker ServiceLiteDBServiceStack

03Entegrasyon ve gerçek zaman

#0010TosQueried
streamtos.bridge
durumCanlıda
yığın.NET Framework · ServiceStack · OrmLite
teknik5 kayıt
CanlıdaBozulma önleyici katman · çok terminal

TOS entegrasyon katmanı

Terminal işletim sistemi Navis N4’ün dört farklı arayüzünü tek bir REST API’nin arkasına saklayan katman; kapı, mobil, faturalama ve ML servisleri buradan geçiyor.

Dört yüzey, tek API
Doğrudan veritabanı sorgusu (OrmLite), SOAP servisleri, REST universal query ve parametreli Groovy çağrıları aynı servis modelinde.
Çok terminal
Terminal başına bağlantı fabrikası, TOS sürümü ve yapılandırmadan gelen kolon eşlemesi; tek kod tabanı birden çok terminale dağıtılıyor.
Alan modülleri
Kapı, mobil, faturalama ve RoRo modülleri ayrı servis, iş ve alan katmanlarıyla.
Gömülü iş kuralları
Kapı işlemi ve vinç kontrolü sorguları; örneğin tartımı yapılmamış ihracat konteynerinin istif değişikliği engelleniyor.
Hata görünürlüğü
TOS aşama hataları istemciye anlamlı biçimde dönüyor, kritik hatalarda e-posta uyarısı gidiyor.
REST uç noktası
~320
TOS arayüzü
4
.NET FrameworkServiceStackOrmLiteSOAPNavis N4
#0011MessageRouted
streamedi.pipeline
durumCanlıda
yığın.NET · EDIFACT · FluentValidation
teknik6 kayıt
CanlıdaMikroservis · EDIFACT

Mesaj hattı ve EDIFACT

E-posta ve dosya kanallarından gelen mesajları kurala göre dağıtan, EDIFACT mesajlarını üreten ve bölen servisler.

Hat mimarisi
Yedi Docker servisi: Email, Ftp, SFtp, DataParser, BusinessRule, Process, Transparent.
Kural eşleme
Gönderen, konu, içerik ya da dosya adı için dinamik predicate zinciri; eşleşmeyen kayıt kendi statüsüne düşüyor.
Korelasyon
Gelen, işlenen ve giden kayıtlar bir ilişki anahtarıyla zincirli; her mesajın uçtan uca izi ve statü yaşam döngüsü var.
EDIFACT üretimi
COPARN ile yükleme ve tahliye COPRAR (D:95B), segment sınıflarından sıra numarasına göre birleştiriliyor; gümrük manifestosu için CUSCAR.
Bölme ve doğrulama
Toplu COPARN dosyaları zarf ve ekipman sınırlarından tek konteynerlik mesajlara bölünüyor; e-postayla gelen XML, konteyner kontrol basamağı dahil doğrulanıp mesaja çevriliyor.
Kanal soyutlama
IMAP, Microsoft Graph, SMTP, FTP/FTPS, SFTP, SMB, SMS ve Excel durumsuz bağlayıcı API’lerin arkasında.
servis
7
kanal tipi
8
EDIFACT segment sınıfı
38
.NETEDIFACTFluentValidationDockerSQL Server
#0012DeclarationFiled
streamcustoms.gateway
durumCanlıda
yığın.NET 10 · ServiceStack · BİLGE
teknik3 kayıt
CanlıdaBozulma önleyici katman

Gümrük entegrasyonu

TOS ile BİLGE gümrük sistemi arasındaki beş iş alanını taşıyan servisler.

Katman ayrımı
Her alan iki API: TOS tarafı adaptör ve süreç API’si. Gümrük modeli TOS modeline sızmıyor.
Kapsam
Ön kapı, beyanname, muayene talebi, KTF ve zamanlanmış olay bildirimi.
Ön kapı
Kayıt açma, kapama ve transfer, kantar onayı ve manuel tartım, boş araç giriş-çıkışı, antrepo akışı.
ön kapı işlemi
~30
alan
5
.NET 10ServiceStackBİLGENavis N4
#0013InvoiceCalculated
streambilling.tariff
durumCanlıda
yığın.NET · SAP · PostgreSQL
teknik4 kayıt
CanlıdaKural motoru · ERP senkronu

Tarife motoru ve SAP senkronu

Hizmet bedellerini hesaplayıp faturalayan motor ve SAP verisini raporlama veritabanına taşıyan senkron.

Kural tabanlı hesap
Ardiye, mesai, bekleme, TEU, serbest süre, tatil, KDV ve taşeron kuralları; şirket ve hat bazında fatura bölme.
Ülke eklentileri
Ülkeye özel kurallar ayrı assembly’lerde strateji olarak; çekirdeğe dokunmadan yeni ülke ekleniyor.
Kur ve ERP
TCMB kur servisi, ERP’ye fatura ve bakiye aktarımı, SignalR ile terminal çağrıları.
Atomik senkron
SAP raporları özel bir HTTP/JSON ucundan çekilip geçici tabloya yazılıyor, tek adımda takas edilip arşivleniyor.
.NETSAPPostgreSQLSignalR
#0014ConsumptionSynced
streamenergy.meters
durumCanlıda
yığın.NET · ServiceStack · PostgreSQL
teknik6 kayıt
CanlıdaDayanıklı entegrasyon · toplu yazım

Sayaç verisi senkronu

Birden çok elektrik dağıtım portalından saatlik tüketimi çekip kendi veritabanına işleyen servis.

İki servis
Dış portallarla konuşan istemci API veritabanına dokunmuyor; iş kuralı ve yazım ayrı serviste.
Paralel ama nazik
Portallar paralel; portal içinde semaforla eşzamanlılık sınırı ve istekler arası gecikme, portal başına ayarlı.
Geri çekilme
Sunucu hatasında üstel bekleme, hız sınırında daha uzun üstel bekleme, istemci hatasında hemen vazgeçme.
Token yönetimi
Portal başına kilitli token yenileme; 401 gelirse bir kez zorla yenileyip yeniden deneme.
Toplu upsert
Sayaç başına ayrı yazım yerine tek INSERT … unnest … ON CONFLICT; saatlik iş ~14 dakikadan ~30 saniyeye indi.
Kültür tuzağı
Türkçe kültürde büyük I dönüşümünün kolon adlarını bozması açık takma adlarla kapatıldı.
saatlik iş
~14 dk → ~30 sn
portal, paralel
6
.NETServiceStackPostgreSQLxUnit
#0015StatusBroadcast
streamequipment.live
durumÜrünleşti
yığın.NET 10 · SignalR · Vue 3
teknik5 kayıt
ÜrünleştiSignalR · çok kiracılı

Gerçek zamanlı ekipman izleme

Saha vinçlerinin durumunu ve iş listelerini süpervizörlere saniyelik yayınlayan sistem.

Üç katman
Veri kaynağı API’si, SignalR yayın API’si ve Vue istemci ayrı dağıtılıyor.
Yayın
İstemci başına SignalR grupları, yapılandırılabilir yoklama aralığı (~1 sn).
Yalıtım
Terminal bağlamı istek başlığıyla taşınıyor, her terminal yalnızca kendi verisini görüyor.
Komut kanalı
TOS’un XML API’si üzerinden uzaktan komut, denetim izi ve bağlantı kopma alarmı.
Gözlemlenebilirlik
Yapılandırılmış loglar log4net üzerinden Elasticsearch’e.
.NET 10SignalRVue 3Elasticsearch
#0016PackagePublished
streamshared.core
durumKullanımda
yığın.NET 10 · Keycloak · log4net
teknik3 kayıt
KullanımdaOrtak çekirdek

Ekip için ortak çatı kütüphaneleri

Servislerin hepsinin üstüne kurulduğu iç kütüphaneler.

Çapraz kesen işler
Bağımlılık enjeksiyonu, yapılandırma, önbellek, standart yanıt zarfı ve merkezi loglama tek pakette.
Kimlik
ServiceStack servisleri için Keycloak ile kimlik doğrulama.
TOS erişimi
Görünüm modelleri, bağlantı fabrikası ve XML güncelleme istemcisi tek kütüphanede; servisler TOS’u doğrudan bilmiyor.
.NET 10Keycloaklog4netElasticsearch