Alert, Event ve Log arasındaki farklar

11 Ara

Yazılımsal bir ekosistemin yönetim ortamında görülmek istenen bazı temel raporlar vardır. Bu yazıda bir birine benzeyen ve bazen karıştırılabilen alert, event ve log kavramlarından bahsedilmektedir.

Alert

Bir alert(alarm), sistemde meydana gelebilecek sıra dışı olaylar olarakdır. Örneğin;

  • Sunucu disk kapasitesinin %90 kullanım oranına ulaşması.
  • Sistemdeki IoT cihazlarının N tanesinin birden kapanması veya hata durumu bildirmesi. (N eşik değer)
  • N tane kullanıcının birden gün içinde bloklanması. (N eşik değer)

Bu ve buna benzer olaylar, sistemin yönetim biriminde raporlar veya bildirimler(sms, email, ses) şeklinde alarm olarak tutulabilirler. Alarmlar genellikle sistemin sağlıklı devam edebilmesi için bildirilen kritik uyarılardır. Belirli bir olay gerçekleştiğinde, sorumlu kişilerin veya sistemlerin harekete geçmesini sağlamak amacıyla yapılan bildirimler olarak da düşünülebilir.

Event

Bir event(olay), sistemde meydana gelebilecek sıradan olaylardır. Örneğin;

  • Yeni kullanıcı kaydı yapıldı.
  • Kullanıcı aktif edildi.
  • Kullanıcı silindi.
  • Sipariş alındı.
  • Sipariş onaylandı.

Bu ve buna benzer rutin olaylar, event olarak kaydedilirler. Sistemde meydana gelen rutin akışın takibi ve kaydı için gerekli bir kayıt kütüğü olarak düşünülebilir.

Log

Kelime anlamı günlük olan log, sistemde meydana gelen olayların otomatik olarak üretilir ve zaman damgalı olarak kaydedilir. Örneğin;

  • Veri tabanı bağlantı hataların detaylarıyla birlikte kaydedilmesi.
  • Servis talebinin olumsuz cevap alması.

Log kayıtları, istenilen seviyede tutulabilir. Bu seviyeler, Info, Warning, Error, Fetal, Debug şeklinde gruplandırılabilir.

  • Info, genellikle sistemdeki yararlı bilgiler şeklinde düşünülebilir. İhtiyaç duyulduğunda bilgi mahiyetinde bakılabilecek kayıtlardır.
  • Warning, sonuçları otomatik olarak düzeltilebilecek, uyarı niteliğindeki bilgilerdir.
  • Error, işlemlerin devam edememesi durumunda kaydedilen bilgilerdir. Sistem yöneticisinin müdahalesini gerektirir.
  • Fetal, sistemin durması veya veri kayıplarının yaşanabileceği durumlarda kaydedilen bilgilerdir.
  • Debug, geliştirme sırasında geliştiriciye bilgiler veren kayıtlardır.

Sonuç

Alert, Event ve Log bilgileri, sistemin yönetilebilirliği açısından çok önemlidir. Bu kayıtlar tutulmadığı taktirde, sistemde ne olup bittiğinden haber alınamaz. Bu tür kayıtlar, bir veritabanında veya dosyalarda tutulabilir. Proje büyüklüğüne göre genellikle log kayıtları dosyalarda, alert ve event kayıtları, veritabanı tablolarında tutulurlar. Bu sayede, alert ve event bilgileri, gösterge panelleri(dashboard) ve raporlarda çıktı olarak alınabilir.

PostgreSQL Veritabanı ve Tablo Boyutları Nasıl Öğrenilir

9 Ara

PostgreSQL üzerinde tanımlanan bir veritabanı veya veritabanı üzerinde tablolarının boyutlarını öğrenmek mümkündür. Bu işlemler için PostgreSQL komutları kullanılır. Komutları, psql komut satırı veya PgAdmin gibi araçlar kullanılabilir.

1. Veritabanı boyutunu veren komut

Aşağıdaki komutta ‘veritabanı_adı’ kısmına kendi veritabanınızı yazabilirsiniz.

SELECT pg_size_pretty(pg_database_size('veritabanı_adı'));

2. Veritabanı tablo boyutunu veren komut

Aşağıdaki komutta ‘tablo_adı‘ kısmına kendi veritabanı tablo adınızı yazabilirsiniz.

SELECT pg_size_pretty(pg_total_relation_size('tablo_adı'));

 

Javascript unary plus (+) operator

30 Haz

Javascript ve diğer programlama dillerinde artı (+) ya da plus (+) operatörü,  toplama işlemi için kullanılmaktadır. Ancak (+) operatörünün Javascript dilinde geliştiricilere avantaj sağlayan bir özelliği daha bulunmaktadır. (+) operatörü, önünde bulunduğu operand eğer sayı değilse, onu sayıya dönüştürmeye çalışır. Operatörün kullanımı şu şekildedir:

+degisken

Yani sadece değişkenin önüne bir (+) işareti eklenir.

Dönüştürülebilen Türler

(+) operatörü aşağıdaki türleri sayıya dönüştürebilir:

  • string (sayı olarak)
  • null
  • boolean
  • integer (pozitif veya negatif)
  • float (pozitif veya negatif)
  • 0x formatındaki onaltılık sayılar.
  • scientific (exponent)  bilimsel üslü sayılar.

Dönüştürülemeyen Türler

(+) operatörü, sayıya dönüştüremediği değerleri NaN olarak verir.

  • undefined
  • string (yazılar)

Örnek

console.log(+”09″);  // Output: 9

console.log(+null);  // Output: 0

console.log(+”7″);   // Output: 7

console.log(+”-7″);  // Output: -7

console.log(+”-3.14″);  // Output: -3.14

console.log(+”3.14″);  // Output: 3.14

console.log(+false);   // Output: 1

console.log(+false);  // Output: 0

console.log(+”0xFF”);  // Output: 255

console.log(+”123e-5″);  // Output: 0.00123

console.log(+”xxx”);   // Output: NaN

console.log(+”undefined”);   // Output: NaN

Sonuç

(+) operatörü yani unary plus operatörünün Javascript dilinde kullanımı örneklerle desteklenerek incelenmiştir. (+) operatörünün pek bilinmeyen ve kullanılmayan bir kullanımı anlatılmıştır.

RxJS Operatorler

29 Haz

RxJS API’nin önemli bir aktörü de Operatörlerdir. Operatörler, gözlemlenebilir nesneler için yardımcı işlemler olarak düşünülebilir. Her bir yardımcı işlem fonksiyonel programlama yöntemine göre fonksiyonlar halinde planlanmıştır. RxJS’de Operatörler 8 alt başlık halinde gruplandırılmıştır.

Bu başlıklar altında onlarca operatör bulunmaktadır. Buradan tüm operatörlere erişebilmek mümkündür. Bu yazıda popüler olanlardan bir kaçını aşağıdaki gibi kullanılmaktadır.

from()

Bir Observable nesne içerisine  array, promise veya iterable değerler eklemek için kullanılır.

concat()

Birden fazla Observable nesnesini bir dizi elemanı gibi sıraya dizer ve sırayla çalıştırır. Biri bitmeden diğerine geçmez. Bunu, biri bitmeden diğeri başlayamayan işlem sıralaması olarak düşünebiliriz.

Bu işlemin çıktısı aşağıdaki gibi olacaktır.

1, 2, 3, 4, 5, 6, 7, 8, 9

merge()

Concat işleminin benzeri olan bu operatörde, birden fazla Observable nesnesini bir dizi elemanı gibi sıraya dizer ancak işlemlerin sırayla yapılması beklenmez.

Bu işlemin çıktısı aşağıdaki gibi olacaktır.

 4, 5, 6, 7, 8, 9, 1, 2, 3

map()

Gözlenen verilerde değişiklik yapmak için kullanılabilir.

Bu işlemin çıktısı aşağıdaki gibi olacaktır.

 1, 4, 9

ajax()

Uzak sunucudan bir Ajax talebi yapmak için kullanılır.

Bu işlemin çıktısı sunucudan gelen JSON response olacaktır.

Sonuç

RxJS kütüphanesinde bulunan Operatorler konusu örnekler ile desteklenerek açıklanmıştır.

RxJS Subjects

28 Haz

RxJS’de Subjects gözlemlenebilir nesnenin (Observable) özel bir türüdür. Bunu, insanlarla dolu bir odadaki mikrofonla konuşan tek bir konuşmacı olarak düşünebilirsiniz. Burada:

  • Konuşmacının mesajları Subject,
  • Dinleyiciler Observer olarak düşünülebilir.

Konuşma esnasında mesajlar aynı anda birçok insana ulaşır. Bu olaya multicasting yani birden çok noktaya yayın yapmak denir. Dört farklı türde Subject vardır.

  1. Subject
  2. AsyncSubject
  3. BehaviorSubject
  4. ReplaySubject

Bu kavramları salondaki bir konuşmacının durumunu anlatan örnekler yaparak açıklayabiliriz.

Subject

Başlangıç değeri almaz ve tekrarlama davranışı göstermez.

Bu kod çalıştığında konsola iki defa, “merhaba sayın dinleyiciler.” mesajı yazılır.  Çünkü iki dinleyici bulunmaktadır. Salondaki bir konuşmacının her aklına geleni söylemesini buna örnek olarak verebiliriz.

AsyncSubject

İşlem tamamlandığında gözlemcilere en son mesaj değerini yayınlar.

Bu kod çalıştığında ekrana iki defa “merhaba arkadaşlar.” yazacaktır. Bunu salondaki bir konuşmacının aklında ilk cümlelerini düşünüp, ne söyleyeceğine karar verdiğinde konuşmasına benzetebiliriz. Yani konuşmacı, kullanıcılara en son aklında bulunan mesajı bildirmiş olur.

BehaviorSubject

Bir başlangıç değerine ihtiyaç duyar. Mevcuttaki en son değeri yeni abonelere yayınlar.

Burada salondaki konuşmacının sahneye çıkar çıkmaz selamlama yaptığı düşünülebilir. Konsola peş peşe iki defa “merhaba arkadaşlar.“, iki defa “nasılsınız“, iki defa da “konumuz küresel ısınma.” yazacaktır.

ReplaySubject

Belirtilen sayıda verilen son değeri, yeni abonelere tekrar yayınlar.

Burada salonda konuşmacı konuşurken bir dinleyici vardır. “selamlar” ve “nasılsınız” şeklinde iki mesaj yayınlanmıştır ve salondaki mevcut dinleyici tarafından bu mesajlar alınmıştır. Ancak ReplaySubject ile salona gelen sonraki dinleyicilere de önceki mesajlar tekrar gönderilir.

Sonuç

RxJS kütüphanesinde bulunan özel Observable türleri örnek uygulamalarla desteklenerek incelenmiştir.

Bir sonraki yazıda, RxJS kütüphanesindeki Operatörler incelenecektir.

RxJS ile Reaktif Programlama

26 Haz

RxJS ReactiveX API’sinin Javascript programlama diline kullanılmak üzere yazılan uygulamalardan biridir. Geliştiricilere, tepkisel olaylar (events) üzerinden güçlü ve işlevsel  bir fonksiyonel yaklaşım sunar. Bunların yanında giderek artan kütüphane ve yardımcı araçları ile geliştiricilere kullanım kolaylığı sağlamakta ve popülerliği artmaktadır.

RxJS reaktif programlamanın bir uygulaması olduğundan dolayı imperative gelenekteki bir programcı için ilk başta öğrenilmesi biraz zor gelebilir. Çünkü fonksiyonel programlama, declerative gelenekte uygulanan bir paradigmadır. Programlama dillerinin sınıflandırmasında bunu görebilmek mümkündür.

 

RxJS uygulaması yapmak için iki farklı yol izlenebilir:

Bana göre basit olan yöntem Angular projesi oluşturmaktır. Angular projesi oluşturmak için npm komutları kullanılır. Bir projeyi üç adımda oluşturmak mümkündür.

Adım-1: Angular CLI yüklenmesi

Angular projesinin yönetimini ve çalıştırılmasını sağlayan global Angular CLI yüklenme adımıdır. Bunun için gerekli olan komut:

npm install g @angular/cli

Adım-2: Uygulamanın oluşturulması

Uygulama için gerekli dosya ve dizinlerin oluşturulması adımıdır. Bu adıma, çalışma ortamının (workspace) hazırlanması da denir. Bu işlemi bir önceki adımda yüklenen Angular CLI komutları yürütür.

ng new myapp

Artık uygulama dosyaları yüklenmiştir ve aşağıdaki gibi bir dizin oluşturulmuştur.

 

 

 

 

 

 

 

 

 

 

 

Uygulama dosyaları src/app dizininde bulunmaktadır. Dizinde bulunan diğer dosyaların ne işe yaradığı bu yazının konusu değildir.

Adım-3 Uygulamanın çalıştırılması

Angular uygulamasını çalıştırmak için Angular CLI komutları çalıştırılır.

cd myapp

ng serve open

Bu komut ile Angular uygulaması, varsayılan tarayıcıda açılarak başlatılacaktır.

RxJS Uygulanışı

Angular projesinde rxjs kodlarını çalıştırmak için Angular projesinde bir typescript dosyası kullanılabilir. app.component.ts dosyası içerisine bir Observable tanımlamak için aşağıdaki gibi bir komut kullanılabilir.

 

 

 

 

 

 

RxJS kodlarını çalıştırmak öncelikle ‘rxjs’ modülünün yüklenmesi gerekmektedir. Bunun için gerekli komut:

import {from} from ‘rxjs’;
Ardından constructor içerisinde from operatörü ile bir observable oluşturulmaktadır.

RxJS Yardımcı Araçları

RxJS kütüphanesinde Operators ve Subjects olmak üzere iki önemli başlık bulunmaktadır. Sonraki yazılarda sırayla RxJS Subjects ve Operators konuları ele alınacaktır.

 

Reaktif Programlama (Reactive Programming)

25 Haz

Reaktif Programlama Nedir?

Reaktif programlama, asenkron veri akışlarıyla işlemler yapmayı ilke edinen bir programlama paradigmasıdır.

Asenkron Prensip

Reaktif programlamada her şey asenkron olarak, yani eş zamanlı olmadan çalışır. Yani bir işlem adımının yürütülebilmesi için başka işlemlerin sonucu beklenmek zorunda değildir. Çalışma zamanında, asenkron bir işlem yürüten kod satırı çalıştırıldıktan sonra, işlemin bitmesi beklenmeden diğer satırdaki işlemler yürütülebilir. Multithread işlemler yürütebilen sistemlerde asenkron yürütülecek olan işlemler, farklı thread’ler tarafından da yapılabilir.

Neden Asenkron çalışmalara ihtiyaç duyulur?

Programlamada asenkron çalışma ihtiyacı, uygulamaları daha duyarlı hale getirmek amacıyla kullanılır. Asenkron işlemler genellikle uzun zaman alan işlemlerdir. Bu nedenle ana uygulama bir görevi yürütürken, kilitlenme ve donma diye tabir edilen yavaşlamaları kullanıcıya yansıtmadan, sorunsuz bir kullanıcı deneyimi sunmayı sağlar. Asenkron işlemler dış kaynaktan bir veriyi almak olabileceği gibi yerelde uzun hesaplama gerektiren işlemler de olabilir.

Reaktif Programlamanın Püf Noktaları

Reaktif programlamada üç temel yapı taşından bahsedebiliriz.

1- Veri akışları (Data Streams)

Reaktif programlamada veri akışları, işin omurgasını oluşturmaktadır. Veriler bir kaynak tarafından oluşturulup başka bir kaynak tarafından tüketilir. Bütün olaylar, mesajlar, hatalar akışlar tarafından yayılma (emitting) yoluyla bildirilir.

2- Observable Pattern

Reaktif programlamada veri akışları gözlenebilir olarak tasarladığından dolayı, akıştan bir bildirim yapıldığında buna tepki verilebilmektedir. Gözlemlenebilir olan veri akışı nesneleri Observable olarak adlandırılırken, akışta gerçekleşen olaylara tepki veren nesneler Observer olarak adlandırılır.

Observable: Reaktif bir sistemde gözlenebilir olan şey veri akışıdır.
Observer: Observable tarafından yayınlanan veri akışlarını yakalar ve kullanır. Observer nesneleri bunu yapabilmek için Observable nesnesine abone (subscribe) olur.

Gözlemlenebilir bir veri akışını herhangi bir işlemden elde etmek mümkündür. Örneğin HTTP talepleri, form tıklama olayları, bildirimler, değişkenlerde meydana gelen değişiklikler, sensörlerden alınan değerler. Kısacası bir durum değişimi bildiren herhangi bir şey olabilir.

3- Fonksiyonel Programlama (Functional Programming)

Veri akışlarını yönetebilmek için uygulanan yöntem fonksiyonların kullanılmasıdır. Bir veri akışından elde edilen verilerin belli bir dönüşümden geçirilerek kullanılması için bir veya birden fazla fonksiyona ihtiyaç duyulabilir.

ReactiveX (Reactive eXtensions)

Reaktif programlama için kullanılan en popüler API ReaxtiveX ya da kısa adıyla Rx’dir. (“X” harfi Extensions için kullanılan bir kısaltmadır). Bu eklenti, reaktif programlama ilkelerinin bir uygulamasıdır. ReactiveX resmi sitesinde ReaxtiveX’in bir API’den ziyade, diğer programlama dillerine de ilham veren bir devrim, bir fikir ve programlamada bir akım olduğu belirtilmektedir.

ReaxtiveX kütüphanelerini kullanarak, aşağıdaki programlama dillerine reaktif özellikler katılabilmektedir.

Örnek RxJS Kodu

RxJS reaktif programlamanın Javascript programlama diline uyarlanmış kütüphanesidir. Javascript örnek uygulaması için öncelikle RxJS kodlarını içeren paketlerin koda dahil edilmesi gerekmektedir. Kodun en başında import sözcüğü ile başlayan satırlar gerekli paketleri yüklemektedir.

 

 

 

 

 

Daha sonra, from sözcüğü ile bir Observable sayı dizisi tanımlanmıştır. pipe() metodu, Observable nesnelere ait bir metottur ve yardımcı operatörleri akışa dahil etmek için kullanılır. Burada filter ve map adında iki operatör sisteme dahil edilmiştir. filter operatörü akıştaki 4’ten küçük sayıları seçerken, map operatörü, kalan sayıların karesini almaktadır.

Örnek kodun adımlarının incelenmesi aşağıdaki gibidir.

Kimler Kullanır?

ReactiveX’i kendi teknolojilerinde kullanan bazı şirketler aşağıda belirtilmiştir.

Sonuç

Bu yazıda reaktif programlamanın ne olduğu ve neden ihtiyaç duyulduğunu, reaktif programlamadaki önemli noktaları incelemiş olduk ve örnek uygulama ile yazımızı sonlandırmış bulunuyoruz.

Putty Kullanıcı Oturum Bilgileri ile Kısayol Oluşturmak

14 Şub

Putty Nedir?

Putty, windows işletim sistemi üzerinden ssh protokolü ile bağlanılabilen  sistemlere, erişim yapabilmek amacıyla kullanılan bir terminal uygulamasıdır. Program, tek bir exe şeklinde indirilmektedir ve kurulum yapılmamaktadır. Uygulamanın arayüz görünümü aşağıdaki gibidir.

Bu arayüz kullanılarak Linux gibi işletim sistemlerine, terminal aracılığı ile erişebilmek mümkündür. Ancak, birden fazla işletim sistemine erişmek istediğimizde her defasında bu ara yüzden kullanıcı erişim bilgilerini girmek biraz zaman alıcı bir yöntemdir. Putty.exe programı, farklı kısayollar üretilerek birden fazla oturum bilgisi ile kaydedilebilmektedir.

Bu işlem için masa üstüne sağ tıklayarak yeni kısayol oluşturulur.

Kısayol ayarlarında, Putty.exe dosyası seçilir.

Oluşturulan kısayola sağ tıklayarak özellikler penceresinde Hedef bölümüne aşağıdaki şekilde kullanıcı bilgileri girilebilir.

"C:\Program Files\PuTTY\putty.exe" -ssh bayram@172.16.1.110 -pw PaSwOrD

İşlem tamamlanmıştır. Kısayola çift tıklayarak, kullanıcı oturum bilgileri girilmeden direk terminal açılacaktır.

Python pip install SSL Sertifika sorunu

11 Şub

Python geliştirme sırasında ihtiyaç duyulan paketlerin bulunduğu repository adresine bazı durumlarda erişim sorunları yaşanabilir. Bu durumlardan biri de firewall arkasında bulunan sistemlerden, https protokolü ile repository erişimi talep edildiğinde, SSL sertifikalarının ilgili firewall tarafından değiştirilmesi nedeni ile meydana gelebilecek sertifika sorunudur. Kendi çalışmalarım sırasında Sophos filrewall arkasında çalışırken böyle bir sorunla karşılaştım.

Python geliştirme IDE’si PyCharm ile geliştirme yaparken Python paketlerini yüklemeye çalıştığınızda aşağıdaki ekran ile karşılaşabilirsiniz. Aşağıdaki örnekte Redis paketinin yüklenmesi sırasında karşılaşılan SSL sorunu vurgulanmıştır.

Bu durumdan kurtulabilmek için PyCharm arayüzünde yapılması gereken, paket yükleme arayüzündeki options kısmına –trusted-host pypi.python.org –trusted-host files.pythonhosted.org –trusted-host pypi.org ayarlarını girmektir.

Bu şekilde yükleme yapıldığında SSL sorunu ortadan kalkacaktır.

PyCharm kullanmadan, pip komutlarını konsol arayüzü aracılığı ile kullanarak yükleme yapmak için gerekli komut:  pip install redis –trusted-host pypi.python.org –trusted-host files.pythonhosted.org –trusted-host pypi.org şeklindedir.

Ancak geliştirme sürecinde onlarca paket yükleme işlemi olacağını göz önüne aldığımızda her defasında bu komutu kullanmak çok ta pratik bir çözüm değildir. Bunun yerinde pip ayarlarını global olarak pip.ini dosyasına eklemek, bizi her defasında aynı komutları girmekten kurtaracaktır. Python 3.7 versiyonu için Windows 10 ortamında pip.ini dosyasına C:\ProgramData\pip\pip.ini şeklide erişebilmek mümkündür.

Artık her pip install <package name> komutu, SSL sorununa takılmadan çalışacaktır.

Stackoverflow üzerinde tartışılan pip always fails ssl verification başlıklı soruya verilen çözüm cevabında belirtildiği üzere, trusted-host  seçeneği aslında SSL’yi atlamaz, ancak geçerli (ya da herhangi bir) HTTPS bulunmadığında (ve yalnızca) ilgili ana bilgisayarı güvenilir olarak işaretler.

Postgis geçersiz geometriler ve Arcgis Drawing Error hatası

11 Oca

PostgreSQL veritabanı ile konumsal(spatial) verilerin yönetilebilmesini sağlayan Postgis eklentisi, geometrik nesneler üzerinde işlemler yapılabilmesini sağlayan bir çok hazır fonksiyon sunar. Bu fonksiyonların tam listesine buradan ulaşabilmek mümkündür.

Bu yazıya konu olan fonksiyon, oluşturulan geometrinin geçerli olup olmadığını bulmaya yarayan St_IsValid fonksiyonu olacaktır. Eğer geometri geçersiz ise PostgreSQL bize geometrinin neden geçersiz olduğuna dair bir de mesaj bildirimi sunacaktır. Geometrilerin geçerliliği ve basitliği konusunda OGC tarafından tanımlanan bilgilere buradan ulaşabilirsiniz.

OGC tarafından basit olarak tanımlanan geometri tipleri, kendini kesen veya kendine teğet olan anormal geometrik noktalara sahip olmayan geometrik şekillerdir.

Örneğin LINESTRING türünde basit ve geçerli bir geometri;

LINESTRING(0 0, 1 1)

Örneğin LINESTRING türünde basit olmayan ama geçerli bir geometri;

LINESTRING(0 0, 1 1, 0 0)

Bu geoemtrinin basit sınıfa girmemesinin sebebi kendini kesen bir noktaya (0 0) sahip olmasıdır.

Ancak öyle durumlar vardır ki, seçilen geometri geçersizdir. Örneğin;

LINESTRING(0 0)

Bu LINESTRING tipindeki geometri tek bir noktadan meydana gelmiştir. Oysa ki LINESTRING tipindeki geometriler en az iki noktadan meydana gelmek zorundadır.

Geçersiz bir geometriyi veri tabanında sorgulamak istediğimizde aşağıdaki gibi bir sonuç alınacaktır.

Geçerli bir geometri sorgusu için ise olumlu bir sonuç alınacaktır.

NOT:

ArcGIS desktop uygulamalarından ArcMap ile çalışırken, geçersiz geometri içeren tablolar görüntülenmek istendiğinde, uygulama “Arcgis Drawing Error” başlıklı bir uyarı mesajı vermektedir. Arcgis geçersiz geoemtriyi çizdiremediği için bu mesajı vermektedir.

Bu hatayı ortadan kaldırabilmek için geçersiz geometrileri SQL query yardımıyla seçerek sistemden silmek gerekmektedir.