Linux Distribution – Linux Dağıtımı nedir?

21 Ağu

Linux distribution yani Linux dağıtımları, işletim sistemi çekirdeği üzerine yazılmış uygulamalar ve bu uygulamaları kullanmayı sağlayan grafik (GUI) veya komut (CLI) kullanıcı arayüzler ile paketlenmiş ürünlere Linux distribution denir. Bunun yanında, mevcut bir dağıtımı temel alarak da yeni dağıtımlar üretilebilmektedir. Örnek Linux dağıtımları;

  • Debian
  • Ubuntu
  • Red Hat
  • Fedora
  • Mint
  • Alphine

Tüm linux dağıtımları çekirdek olarak aynıdır. Ancak kullanıcı arayüzleri ve programları ile farklılık gösterirler. Bazı linux dağıtımlarında kullanıcı dostu arayüzler sağlanırken bazı dağıtımlarda gereksiz olan her şey çıkartılarak iş odaklı ve light weight ürünler sunulmaktadır.

Linux dağıtımları, bilgisayarın diski üzerine kurulabildiği gibi, hiç kurulum yapmadan flash disk veya cd üzerinden de kullanılabilmektedir.

İsteyen herkes kendi Linux dağıtımını geliştirip sunabilir. Bu durum linux dünyasının özgür yazılım ilkesine uygundur.

Ülkemizde geliştirilen Linux dağıtımları aşağıdaki gibidir.

Günümüzde binlerce Linux dağıtımı piyasaya sürülmüş durumdadır. Bu sürümlerden bazıları geniş bütçeli şirketler tarafından desteklenerek finanse edilmektedir. Her ne kadar özgür bir dünya sunulsa da bazı Linux dağıtımları için sunulan destek ve ürünler firmalar tarafından ücretli bir şekilde sunulmaktadır.

Windows Terminal Kullanımı

14 Ağu

Microsoft, windows 10 ile birlikte yeni bir terminal aracını biz kullanıcıların hizmetine sunmuştur. Windows bünyesinde bulunan ilk komut kullanım aracı Command Prompt’tur. Daha sonra yeni bir komut arayüzü olarak Powershell aracı Windows’a dahil edilmiştir. Fakat bu iki araçta rakip işletim sistemlerinin sunduğu konsol araçlarına göre biraz kulanışsız kalmıştır. Örneğin birden fazla ortamda komut satırı çalıştırmak istediğimiz de çok fazla pencere açmamız gerekmektedir. Ayrıca bu araçlarda tab özelliği bulunmamaktadır.

Mizrosoft firması, bu eksiklikleri kapatan açık kaynak kodlu Windows Terminal aracını geliştirmiştir. Windows terminal aracı hem tab kullanımı ile birden fazla pencereyi tek bir ekranda yönetme imkanı sunar, hemde temalar ile görseli özelleştirilebilen bir özelliğe saiptir. Windows terminal aracı windows store üzerinden indirlebilmektedir.

Windows terminalde birden fazla konsol aracını yukarıda görüldüğü gibi aynı anda açabilmek mümkündür. Her konsol aracı ayrı bir tab da görünür. Yeni tab eklemek için pencerenin üst kısmındaki aşağı ok tuşuna basarak istediğimiz aracı seçebiliriz. Resimde dikkat ederseniz ubuntu konsol aracı da eklenmiştir. Bu aracı windows ortamında kullanabilmek için WSL(Windows Subsystem for Linux) kullanabilirsiniz. Bu araç sayesinde windows üzerinde windows store kullanarak istediğimiz linux sürümünü kurabiliriz.

Windows terminalde görünüm özelleştirilebilmektedir. Bunun için aşağıdaki ayarlar sekmesinden ;

Aşağıda sarı ile işaretli araylar butonuna tıklandığında, varsayılan editör ile terminalin ayarlar dosyası (settings.json) açılır.

Benim bilgisayarımda Visual Studio 2019 olduğu için bu editör ile ayarları yapabiliyorum.

Settings.json dosyasında her terminal için profiles objesindeki list kolleksiyonunda ayarlar bulunur. Terminalin görünüm özelliğini değiştirmek için iki yol vardır.

Birinci yol Color Schemas sayfasından Included color schemas bölümündeki hazır şemalar kullanılabilir.

  • Campbell
  • Campbell Powershell
  • Vintage
  • One Half Dark
  • One Half Light
  • Tango Dark
  • Tango Light

Örneğin Powershell’de One Half Dark şeması için ayarları şu şekilde değiştirip kaydetmek yeterlidir. Görüntü hemen güncellenecektir.

{
      // Make changes here to the powershell.exe profile.
      "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
      "name": "Windows PowerShell",
      "commandline": "powershell.exe",
      "hidden": false,
      "colorScheme": "One Half Dark"
}

İkinci yol ise kendi ayarlarımızı settings.json dosyası içerisindeki schemes dizisine eklmektir. Burada terminal görsellerine ait çok fazla ayar bulabilirsiniz. Örneğin Command Propt için schemas dizisine aşağıdaki gibi bir ayar ekleyelim.

"schemes": [
     {
       "name": "Aurora",
       "black": "#23262e",
       "red": "#f0266f",
       "green": "#8fd46d",
       "yellow": "#ffe66d",
       "blue": "#0321d7",
       "purple": "#ee5d43",
       "cyan": "#03d6b8",
       "white": "#c74ded",
       "brightBlack": "#292e38",
       "brightRed": "#f92672",
       "brightGreen": "#8fd46d",
       "brightYellow": "#ffe66d",
       "brightBlue": "#03d6b8",
       "brightPurple": "#ee5d43",
       "brightCyan": "#03d6b8",
       "brightWhite": "#c74ded",
       "background": "#23262e",
       "foreground": "#ffca28",
       "selectionBackground": "#292e38",
       "cursorColor": "#ee5d43"
     }
   ]

Bu ayarı artık command propt için kullanabiliriz.

{
      // Make changes here to the powershell.exe profile.
      "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
      "name": "Command Prompt",
      "commandline": "powershell.exe",
      "hidden": false,
      "colorScheme": "Aurora"
}

SQL IN Operatoru ile Kapasiteden Fazla Çoklu Sorgulama

24 Haz

SQL sorgularında IN operatoru kullanarak WHERE şartı içerisinde çok fazla sayıda kriter belirleyerek sorgulama yapılabilmektedir.

SELECT 
   * 
FROM 
   Customers
WHERE 
   Country IN ('Germany', 'France', 'UK');

Bazı database engine’ler IN operatörü içerisinde kısıtlamalar getirir. Örneğin oracle IN içerisine default ayarlarda en fazla 1000 kayıt almaktadır. Bu gibi durumlarda kısıtlama ayarlarına müdahale edilemiyorsa IN operatorlerini OR ile birleştirerek kullanabilirsiniz.

SELECT 
   * 
FROM 
   Customers
WHERE 
   Country IN ('Türkiye', 'France', 'UK', ...) //1000 adet
   OR
   Country IN ('Italy', 'China', 'Russia', ...) //1000 adet
   OR
   Country IN ('Japan', 'Spain', 'Germany', ...) //1000 adet;

Bu yöntemi gerektirecek durumlara çok sık rastlanmasada dış kaynaklardan gelen Excel, XML, vs dosyalarından gelen verilerde arama yapmak durumunda kaldığınızda size bir çıkış yolu olabilir.

Fullstack Developer Nasıl Olunur?

16 Nis

Fullstack developer doğulmaz, fullstack developer olunur. Peki o zaman fullstack developer nedir? Fullstack deceloper olanlar neleri bilmelidir?

“Her şey hakkında bir şey öğrenmeye ve bir şey hakkındaki her şeyi öğrenmeye çalışın.” demiş Thomas H. Huxley. Uzmanlık alanında geliştirme yapmak, bu felsefeye uygun olsa da, fullstack olmak her şey hakkıında biraz daha fazla şeyler bilmeyi gerektirir.

O halde fullstack developer olanların alet çantasında neler bulunmalıdır? Başlıklar halinde belirtmek gerekirse;

  • Front End
  • Back End
  • Database
  • Mobile
  • Dev/Ops

Front End

  • Temel Bilgiler
    • HTML
    • CSS
    • JS
  • Framework ve Kütüphaneler
    • Angular
    • React
    • Vue
  • Arayüz Tasarım Araçları
    • Bootstrap
    • Material Design
  • Paketleme araçları
    • Babel
    • Webpack

Back End

  • Programlama Dilleri
    • C#
    • Java
    • Python
    • Javascript (Nodejs)
    • Ruby on Rails
  • ORM Araçları
    • Entity Framework
    • NHibernate
    • Hibernate
  • Cache Araçları
    • Redis
    • Memcached
  • Mesaj Kuyruk Yapıları (Message Queuing)
    • RabbitMQ
    • Kafka
  • Programlama Paradigmaları ve Disiplinleri
    • Object Oriented Programming
    • Functional Programming
    • Design Patterns
    • API (REST/SOAP)
    • SOLID Prensipleri

Database

  • RDBMS (Relational Database Management Systems)
    • PostgreSQL
    • Oracle
    • MsSQL
    • MySQL
    • SQLite
  • NoSQL
    • MongoDB
    • Cassandra
    • CouchDB

Mobile

  • Android
    • Java
    • Kotlin
  • iOS
    • Objcetive-C
    • Swift
  • Hybrid
    • React Native
    • Ionic Framework
    • Xamarin
    • Unity

DEV/OPS

  • Altyapı (Infrastructure)
    • AWS
    • Azure
    • Google Cloud
    • Heroku
  • Otomasyon (Automation)
    • Azure Devops
    • Jenkins
    • GitLab
    • Github
    • Travis CI
    • Circle CI
    • TeamCity
  • Sanalaştırma (Virtualization)
    • VMWare
    • Hyper-V
    • VirtualBox
  • Konteynırlaştırma (containerization)
    • Docker
    • Hyper-V Containers
    • Kubernetes
    • Openshift

Fullstack developer olanlar yukarıda belirtilen araçların hepsini birden çantasında bulundurmak zorunda değildir. Ancak her başlıktan bir araç seçerek o araç hakkında bilgi sahibi olmalıdır. Avantaj ve dezavantajlarını hakkında fikir sahibi olmalıdır. Bu sayede developer, bir projede hangi aracı kullanması gerektiği hususunda bilgi sahibi olacaktır.

Entity Kalıtım Özelliğinin Veritabanında Temsil Edilmesi

11 Mar

Nesneye yönelik programlama(OOP-Object Oriented Programming) yönteminin üç temel özelliği bulunmaktadır. Bunlar;

  • Encapsulation (Kapsülleme)
  • Polymorphism (Çok biçimlilik)
  • Inheritance (Kalıtım)

Bu yazının konusu, inheritance(kalıtım) özelliğinin veri tabanında temsil edilmesidir. Kalıtım, bir sınıfın bazı özelliklerini üst sınıftan almasına denir.

Örneğin bir uygulamadaki kullanıcıları, bireysel ve kurumsal olarak ayırarak temsil etmek istediğimizde nesneye yönelik bir tasarım kullanarak aşağıdaki gibi bir yapı oluşturabiliriz.

public class User
{
     public int Id { get; set; }
     public string Username { get; set; }
     public string Password { get; set; }
     public string Email { get; set; }
}

public class IndividualUser: User {    
     public string FirstName { get; set; }     
     public string LastName { get; set; } 
} 

public class CorporateUser: User {     
     public string Title { get; set; }     
     public string NationalTaxNumber { get; set; } 
}

Görüldüğü üzere, tek bir class tipi kullanarak tüm özellikleri(property) içerisine doldurmadık. Bunun yerine, User adında bir ana class ve IndividualUser, CorporateUser isimli iki alt class oluşturduk. Çünkü User class içerisindeki özellikler diğer class’lar için ortaktır.

Bu yapının, sadece programlama tarafında temsil edilmesi bizim için yeterli olmayacaktır. İlgili kayıtların aynı zamanda veritabanına kaydedilebilmesi gerekmektedir. Bu nedenle, veritabanında bu yapıya uygun bir çalışma yapmak gerekmektedir. Veritabanı tasarımı yapılırken Normal Form(NF) kuralları dikkate alınmalıdır.

Normal form kurallarının ihmal edilmesinin iki sebebi olabilir. Birincisi kurallardan haberdar olmamak. İkincisi, kurallarla uğraşmadan olayın kod tarafında çözülebileceğinin düşünmektir.

Normal Form kuralları bazı durumlarda ihlal edilebilmektedir.

Tek tablo kullanarak kural ihlali

Kurumsal ve Bireysel kullanıcıları tek bir tablo içerisinde tutmak istediğinizde, tüm alanlar tek bir tablo içerisinde bulundurulacaktır. Bu durumda bireysel kullanıcılar için Title ve NatianalTaxNumber alanları boş kalacak, kurumsal kullanıcılar için FirstName ve LastName alanları boş kalacaktır. Tabloda bir kolon ya nullable ya da non-nullable özellikte olmalıdır. Nullable kolonlar, feature için henüz elde edilememiş ancak elde edildiğinde girilecek olan alanlar için kullanılır. Oysa burada FirsName, LastName, Title, NationalTaxNumber gibi alanlar kayıt türüne göre olmazsa olmaz alanlardır.

IdUsernamePasswordEmailFirstNameLastNameTitleNatiaonaTaxNumber
1bob1232b@mail.comBobSmith
2corp1235c@crp.comCorp4656512
Tek tablo kullanımı

Tek tablo çözümlerinde bazen 1NF kuralları hiçe sayılabilmektedir. Örneğin tasarım yapılırken, Name diye bir alan açarak bireysel kullanıcılar için ad ve soyad birleştirilerek bu alana yazılıp, kurumsal kullanıcılar için şirket adı aynı kolona yazılabilmektedir. Bunlar 1NF kuralına aykırıdır. 1NF kuralları;

  • Tekrarlanan sütun yapıları olmamalıdır.
  • Birden fazla bilgi tek bir sütunda olamaz.
  • Bir alan içerisindeki bilgi özel karakterlerle ayrılarak tutulmamalıdır.

İki tablo kullanarak kural ihlali

Eğer bireysel ve kurumsal kullanıcılar için iki ayrı tablo tutulursa;

IdUsernamePasswordEmailFirstNameLastName
1bob1232b@mail.comBobSmith
IndividualUsers
IdUsernamePasswordEmailTitleNatiaonaTaxNumber
1corp1235c@crp.comCorp4656512
CorporateUsers

Bu durumda, müşteri ile ilişkilendirilecek olan bir tabloda hangi Id bilgisi tutulacak? 1 numaralı id bilgisi hem kurumsal hem de bireysel kullanıcı tablosunda bulunmaktadır. Örneğin Sipariş tablosuna ilişki kurulmak istendiğinde, iki tablo ile birden ilişki kurulmak durumunda kalınacaktır.

Üç tablo kullanarak kalıtım özellikli tasarım

Kalıtım özelliğini veritabanına yansıtarak bir tasarım oluşturmak, hem SOLID prensiplerine hem de OOP mantığına uygun olacaktır.

IdUsernamePasswordEmail
1bob1232b@mail.com
2corp1235c@crp.com
Users
UserIdFirstNameLastName
1BobSmith
IndividualUsers
UserIdTitleNatiaonaTaxNumber
2Corp4656512
CorporateUsers

Bu tasarıma sayesinde, bir önceki tasarımdaki ilişki sorunu çözülmüş olacaktır. Siparis tablosu ile ilişki kurulacak tablo Users tablosu olacaktır.

Postgresql Databse Table Diagram (Datagrip)

Artık kullanıcılar tek bir merkez tablodan(users) Id bilgisi elde edecektir. Yeni bir kullanıcı türü geldiğinde sistemin mevcut özellikleri bozulmadan yeni özellik ekleme(extensibility) sağlanmış olacaktır. Örneğin iot_users gibi cihaz temelli bir kullanıcıyı sisteme eklemek kolay olacaktır. Bu sayede sistem open/closed prensibine uyugun olacaktır.

Ekstra Bilgi

Bu tasarıma göre users tablosunda user_type gibi tür bilgileri tutulmamaktadır. Sorgulamalarda kolaylık olsun diye bu tür bir alan açıldığında, eğer kurumsal bir kullanıcı eklenirken yanlışlıkla kullanıcı türü bireysel olarak işaretlenirse veri tutarlılığı bozulacaktır. Bunun yerine kullanıcıların türlerine göre sayılarını raporlamak için örnek bir sorgu aşağıdaki gibi oluşturulabilir;

select type, count(*)
from (
      (select 'Individual' as type  from individual_users)
        union all
      (select 'Corporate' from corporate_users)
        union all
      (select 'IoT' from iot_users)
     ) tables
group by (type);

Özet

Programlama dünyasında kullanılan teknik ve prensipler, veritabanı için bir engel değildir. Birinde OOP kuralları uygulanırken, diğerinde Normal Form kuralları uygulanarak doğru tasarımlar yapılabilmektedir. Programlama yaparken kolaylık olsun diye veya SQL sorgulamalarında kolaylık olsun diye hatalı tasarıma yönelmek veri bütünlüğünü ve tutarlılığını bozabilir.

IIS Rewrite ve Olası Hatalar

7 Mar

IIS üzerinde bulunan Rewrite modülü, URL için yeniden yazma diye adlandırılan kuralları uygulamayı sağlar.

  • Dış dünyaya açık olmayan iç sunuculara erişimin kontrolü
  • Kurumunuzdan tek bir IP üzerinden erişim sağlanabilen URL adreslerine erişimin çoğaltılabilmesi ve güvenlik altına alınabilmesi

gibi bir dizi kuralların uygulanması URL Rewrite modülü ile gerçekleştirilebilir. Bunun için IIS üzerinde bir Web site veya bir web site içerisine oluşturulan bir uygulama üzerinden bu kurallar tanımlanabilir.

Kurallar IIS arayüz ekranından tanımlanabildiği gibi, web sitesi dizininde bulunan Web.config dosyasında de tanımlanabilmektedir. Zaten arayüzden yapılan ayarlar da Web.config içerisine yazılmaktadır.

Örnek Kurallar

Bu kurallara göre,

  • Kuralı uyguladığınız siteye, örneğin http://uygulama.com/api şeklinde gelen talepler http://172.16.10.11/api adresine yönlendirilir.
  • http://uygulama.com/api?a=1&b=2 ile gelen querystring parametreleri aynı şekilde yönlendirmeye taşınır.
  • http://172.16.10.11/api adresindeki api, basic authentication ile doğrulama gerektiriyor. Kullanıcı adı ve şifre bilgileri Base64 string olarak kodlanıp sunucu değişkeni(server variable) olarak eklenmektedir.

Server Variable Hatası

Kurallara ServerVariables eklendiğinde karşılaşılabilecek olası hatlardan biri 500 internal error olacaktır.

Hata sayfasında hata hakkında detaylı bilgi bulunmamaktadır. Detaylı bilgileri alabilmek için Web.config içerisinde hata aşağıdaki ayarları yapabilirsiniz.

<system.webServer>    
   <httpErrors errorMode="Detailed" />     
</system.webServer> 
<system.web>     
    <customErrors mode="Off"/>
</system.web>

Bu ayarlamadan sonra hata detaylarını şu şekilde görebilirsiniz.

HTTP Error 500.50 – URL Rewrite Module Error.

The server variable “HTTP_Authorization” is not allowed to be set. Add the server variable name to the allowed server variable list.

Hata detayına göre Server Variable olarak kullanılacak bilginin IIS web sitesinde önceden belirtilmesi gerekmektedir. Bunun için URL Rewrite penceresinde, sağ taraftaki View Server Variables kısmından HTTP_AUTHORIZATION değişkenini eklemelisiniz. Bu sayede URL Rewrite modülüne, Authorization header tanıtılmış olacak ve hata ortadan kalkacaktır.

Hayat kavanozuna önce önemli şeyleri yerleştirin

6 Şub

Bu videoda, insan hayatının bir kavanoz misali nasıl doldurulması gerektiği anlatılmaktadır. Önce kavanozda topların üzerine sizi eksik yapan şeyler yazılmış ve kavanozun içerisine atılmış. Bunlar; aileniz, arkadaşlarınız, sevgiliniz, yedikleriniz, içtikleriniz, hobileriniz veya tutkularınız olabilir. Tüm bunlarla dolu bir hayatta, başka hiç bir şeye yer yokmuş gibidir. Ama hayatınıza başka şeyleri de sığdırabilecek boşluklar hala vardır. Toplarla dolu bir kavanoza ince çakıl taşları döküldüğünde topların arasındaki boşluklara sığdığı gibi. Bunlar sizin işiniz, mesleğiniz, arabanız, eviniz, paranız olabilir. Bunlar önemlidir, ancak bunlar olmasa da hayatınız yine de doludur. Siz bunların hepsine birden sahipseniz gerçekten şanslısınız. Çakıl taşları eklenen kavanozda hala boşluklar vardır. Bu boşluklar da daha ince kum taneleri ile doldurulabilir. Bunlar izlediğiniz filmeler, maçlar, oynadığınız oyunlar, spor aktiviteleriniz olabilir. Bunlar nefsinize hitap eden şeylerdir ve önemsizdir.

Şimdi boş bir kavanoza önce ince kum tanelerini, sonra çakıl taşlarını ve sonra da topları doldurmayı deneyin. Topların yarısı dışarda kalacaktır. Yani hayatınızı önce hobilerinizle, sonra iş para ile, sonra da asıl ihtiyaçlarınızla doldurmaya kalktığınızda asıl ihtiyaçlarınıza yer kalmayacaktır.

Yerleşim sıralamasının hayatınızı nasıl etkilediğini gördünüz mü?

Kullandığım Faydalı PostgreSQL Fonksiyonları

20 Oca

PostgreSQL veritabanında kullandığım ve herkese faydası olabilecek bazı istatistiksel ve yönetimsel fonksiyonları başlıklar halinde paylaşmak istiyorum. Yazı içerisindeki linklerden tüm fonksiyonlara ulaşabilirsiniz.

İstatistik Toplayıcı Fonksiyonlar

PostgreSQL vertabanının istatistik toplayıcısı, sunucu etkinliği hakkındaki bilgilerin toplanmasını ve raporlanmasını destekleyen bir alt sistemdir. Toplanan istatistikler kullanıcılara yönetimsel anlamda fayda sağlar.

pg_stat_activity

Veritabanında yürütülen işlemin mevcut faaliyeti ile ilgili bilgileri pg_stat_activity fonksiyonu gösterir. Gerçekleşen her işlemin bilgisi tek bir satırda listelenir. Sorgunun yapıldığı anda veritabanında hangi işlemlerin aktif olduğunu görüntüleyebilirsiniz. O anda yürütülmekte olan sorguları, sorguları hangi kullanıcının ne zaman başlattığını, process kimlik numarasını öğrenebilirsiniz.

select * from pg_stat_activity;
select * from pg_stat_activity order by query; // Sıralı

Sistem Yönetim Fonksiyonları

Sistemsel fonksiyonlar, veritabanını kontrol etmek ve izlemek için kullanılırlar.

current_setting(setting_name text [, missing_ok boolean ])

Bu fonksiyon, setting_name parametresi ile verilen ayarın değerini gösterir.

select current_setting('datestyle'); // ISO, MDY
select current_setting('timezone');  // UTC

set_setting(setting_name text, new_value text, is_local boolean)

Bu fonksiyon, setting_name adındaki ayarın değerini new_value değeri ile değiştirir. Eğer is_local değeri true olarak işaretlenirse yeni ayar yalnızca mevcut işlem için geçerli olacaktır. Mevcut oturumda geçerli olması için is_local false olarak işaretlenmelidir.

SELECT set_config('log_statement_stats', 'off', false);

pg_cancel_backend (pid integer)

Arka planda çalışan pid numaralı işlem kimliğine sahip olan sorguyu iptal eder. Örneğin ABC kullanıcısı farkında olmadan sistem kaynaklarını aşırı tüketen ve saatler süren bir sorgu çalıştırdı. Bunu iptal etmek için önce pg_stat_activity ile ilgili sorguyu bulduktan sonra ilgili sorguyu iptal edebilirsiniz. Ancak sadece superuser olanlar superuser olanların işlemlerini iptal edebilirler.

select pg_cancel_backend (1145);

pg_terminate_backend (pid integer)

Arka planda çalışan pid numaralı işlem kimliğine sahip olan oturumu sonlandırır. Ancak sadece superuser olanlar superuser olanların oturumlarını sonlandırabilir.

select pg_terminate_backend (1145);

Karmaşık Yazılım Oluşturmanın Genel Sorunları

19 Oca

Karmaşık yazılımlar denildiğinde akla gelen ilk yöntem Domain Driven Design (DDD) olur. DDD yaklaşımını etki alanına dayalı yazılım olarak tercüme edilebilir. Etki alanı demek üzerinde çalışılan sektör ya da bölüm olarak düşünülebilir. Örneğin finans, e-ticaret, hastane, hava yolu, demir yolu vs gibi alanlar yazılımlar için etki alanları ya da Domain’ler olarak adlandırılabilir.

Etki Alanına Dayalı Tasarım (DDD), Eric Evans tarafından “Domain Driven Design: Tackling Complexity in the Heart of Software” adlı eserle ortaya atılan bir geliştirme felsefesidir. DDD, ekiplerin karmaşık sorun etki alanları için yazılımın geliştirilmesi ve bakımının etkin bir şekilde yönetmesini sağlayan bir yazılım geliştirme yaklaşımıdır. Bu yöntem bir programlama paradigması veya kodlama yöntemi değildir. Bu yöntem kodlamadan önce, çalışılacak iş ortamını(domain) tanımak, çalışma alanındaki gerçek dünyayı anlayarak düzgün bir şekilde tasnif etmektir diyebiliriz. Yazılımda yaşanan sorunların çoğu domain içinde saklıdır.

Karmaşık yazılımın zorlukları

Heyecanla ve pembe hayallerle başlanan karmaşık iş uygulamalarının modeli, zamanla en popüler yazılım mimari tasarım modeli olan Big Ball of Mud (BBoM) modeline dönüşür. Bu model Brian Foote ve Joseph Yoder tarafından yazılan bir makalede “gelişigüzel yapılandırılmış, özensiz, koli bandı ve balya teli yumağı, spagetti kodu ormanı” diye tarif edilmiştir. Bu modelde ayırt edilebilir mimariye sahip olmayan uygulamalar için kullanılır. (Bir tabak spagettiyi hayal edebilirsiniz.)

Şekil-1 de görüldüğü üzere yazılımdaki karmaşanın iki sebebi vardır.

  • Yazılımın karmaşık ve yönetilmesinin zor olmasının ana nedenlerinden biri, alan karmaşıklıklarının teknik karmaşıklıklarla karıştırılmasıdır.
  • İş akışındaki rutin değişiklikler ve küçük özellik geliştirmelerinin, mevcut kodu okuma ve anlamadaki zorluklar nedeniyle uygulanmasının zor olması.
Şekil-1 Yazılımdaki karmaşıklık.

Ortak Bir Dil Olmadan Oluşturulan Kod

İş uzmanlarıyla çalışan ekiplerin domain ortamında kullanılan kavramları, zengin kelime dağarcığı ile doğru bir şekilde yazılım ekiplerine aktarması gerekir. Aksi halde yeni domain kavramları ortaya çıkarılamaz veya geç ortaya çıkarılır maliyetler artar. Bu noktada, iş uzmanları ile geliştirme ekipleri arasında ortak bir dil oluşur. Ortak bir dile odaklanma eksikliği ve sorunlu domain bilgisi neticesinde, çalışan ancak işletmenin amacını ortaya çıkarmayan bir kod tabanı ortaya çıkar. Bu, kod tabanlarının okunmasını ve yönetilmesini zorlaştırır. Çünkü analiz modeli ile kod modeli arasındaki çeviriler maliyetli ve hataya açık olabilir. Sonuçta işletmenin analiz modelinden uzaklaşan kod yapısı ile uygulama bir BBoM modeline dönüşebilir.

İşletme analiz modeli nedir?

Yazılımın nasıl inşa edildiğini anlamak için teknik olmayan kişilerin kavramsallaştırabileceği yazılımın temsilidir. UML gibi modelleme dilleri kullanılarak temsil edilebilir. Bir yazılım uygulamasının mantıksal tasarımını ve yapısını tanımlamak için bir analiz modeli kullanılır.

Organizasyon Eksikliği

BBoM’ye dönüşen bir sistemin ilk üretimi çok hızlıdır. Belli bir domain etrafında kavramsallaştırılmamış uygulamalarda yeni geliştirmeler eklemek veya var olan özellikleri değiştirmek zahmetlidir. Kod tabanı, değişikliği yönetilebilir kılmak için iş davranışıyla gerekli uyumdan yoksundur. Problemin karmaşıklığı, teknik çözümün karmaşıklığı ile karıştırılır.

Şekil-2 Kod çürümesi.

BBoM Deseninin Gelişimi Engellemesi

Spagetti benzeri bir desenle ısrar etmeye devam etmek, özellik geliştirme hızını yavaşlatır. Kod tabanının anlaşılmaz karmaşası nedeniyle, ürünün yeni sürümleri çıktığında hatalar oluşabilir. Zamanla, geliştirme ekibi böylesine bir karmaşa içinde çalışmanın zorluğundan giderek daha fazla şikayet eder. Projeye iş gücü kaynakları eklense bile hız, işi tatmin edecek seviyeye çıkarılamaz. Sonunda, durumdan bıkmış olarak, uygulamanın yeniden yazılması talebi kabul edilir. Başlangıçta hızlı geliştirilen ve teslim edilen uygulama, sonuçta olarak bir kabusa dönüşür.

Problem Alanına(Domain) Odaklanamama

Üzerinde çalıştığınız iş alanını anlamadan geliştirdiğiniz projeler başarısız olur. Yazılım projelerinin yapılması zor veya tıkandığı yer kodlama değildir. Kodlama, sürecin kolay bir bölümüdür. Zor olan, üzerinde çalışılan iş alanına faydalı, istekleri tam olarak yerine getirebilen bir yazılım modelini oluşturmak ve sürdürebilmektir.

İş alanınızı anlamaya ne kadar çok yatırım yaparsanız, iş sorunlarını çözmek ve onu yazılımda modellemek için o kadar donanımlı olursunuz.

Problem alanı(domain) nedir?

Problem alanı, üzerinde çalıştığınız ve yazılım geliştirdiğiniz alanı ifade eder. DDD bize karmaşık iş alanları için yazılım oluşturmaya çalışırken, her şeyden önce problem alanına odaklanmayı önerir. Faydalı bir yazılımın ortaya çıkabilmesi için alanında uzman kişiler yazılım ekipleriyle birlikte çalışır. Örneğin, sağlık sektöründe hasta kayıt yazılımı için doktor kadar bilgi sahibi olmaya gerek yoktur. Bilinmesi gereken, ilgili sağlık terimleri, kavramları, farklı departmanların hastalara ne tür işlemler yaptırdığı ve doktorların hastalardan neler talep ettiğidir.

Kaynaklar

  • Patterns, Principles, and Practices of Domain-Driven Design
  • Domain-Driven Design: Tackling Complexity in the Heart of Software

Arcgis Server Domain Query

17 Oca

Arcgis ile oluşturulan Geodatabase üzerinde tanımlanan attribute domain yani kod listeleri arcgis server üzerinden yayınlanmaktadır.

Tanımlanan attribute domain’ler feature class üzerindeki alanlara eklenebilmektedir. Örneğin tablodaki land_type alanına yukarıdaki LandValue tipi atanabilmektedir. Kullanıcılar ekranda “Residential” değerini görürken değer olarak “Res” kullanırlar. Bu yöntem web ortamındaki combobox ile benzer özelliktedir.

Tanımlanan kod listelerine arcgis server yayınları üzerinden erişmek mümkündür. Yayınlanan FeatureServer veya MapServer aresindeki queryDomains adresi sorgulamak için gerekli arayüzü sağlar.

Aşağıdaki örnekte örnek arcgis server adresinden bir kesit sunulmuştur.

https://sampleserver6.arcgisonline.com/arcgis/rest/services/Water_Network/FeatureServer/queryDomains?layers=16&f=html

"domains": [
  {
   "type": "codedValue",
   "name": "piPipeMaterial",
   "description": "Pipe material types based on NASSCO standards",
   "codedValues": [
    {
     "name": "ABS Plastic",
     "code": "ABS"
    },
    {
     "name": "Asbestos Cement",
     "code": "AC"
    }],
   "fieldType": "esriFieldTypeString",
   "mergePolicy": "esriMPTDefaultValue",
   "splitPolicy": "esriSPTDefaultValue"
  }

Liste çok uzun olduğu için bir kısmı alınmıştır.

Elde edilen bu kod listesini web veya desktop uygulamalarda kullanmak mümkündür. Bu şekilde alan tipinden policy tiplerine kadar bütün bilgileri edinebiliyoruz.