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.

Javascript Callaback Hell Nedir?

16 Oca

Programlama dünyasında asenkron yani eş zamansız olarak tabir edilen fonksiyonlar, yürütülen diğer fonksiyonlara paralel olarak çalışırlar.

Neden asenkron?

Asenkron işlemler, kod içerisinde çalıştırılan bir fonksiyonun ne kadar zaman alınacağı veya ne zaman tamamlanacağı bilinmediği durumlarda tercih edilirler. Örneğin aşağıdaki işlemlerin ne kadar süreceği bilinemez;

  • API’den talepte bulunmak.
  • Dosya okuma ve yazma işlemleri.
  • Veritabanında işlem yapmak.
  • Email göndermek.

Asenkron fonksiyonlar “sen diğer işlemlere devam et, benim işim bittiğinde ben sana haber ederim” yönteminde çalışırlar. Asenkron fonksiyonlar bize haber etmek için callback diye adlandırılan fonksiyonları kullanılırlar.

setTimeout() örneği

Javascript programlamada asenkron işlemlere örnek olabilecek en basit fonksiyon setTimeout() fonksiyonudur. setTimeout(callback, miliseconds) fonksiyonu iki parametre alır. Parametrelerden biri işlem bittiğinde çalıştırılacak olan callback fonksiyonu, diğeri ne kadar bekleneceğidir. Belirlenen süre kadar bekledikten sonra, parametre olarak aldığı fonksiyonu çalıştırır.

function notify() {
  console.log("Notification!");
}

setTimeout(notify, 3000);

Örnekte, 3 saniye bekledikten sonra callback olarak belirlenen notify() fonksiyonu çalıştırılır.

Asenkron fonksiyonlar çağrıldığında, hemen ardından çalıştırılan kod asenkron fonksiyonun bitmesini beklemek zorunda değildir.

function notify() {
  console.log("Notification!");
}

setTimeout(notify, 3000);
console.log("Merhaba!");

Yukardaki örnekte sırayla;

  • Önce setTimeout() süreci başlatılır.
  • Konsola “Merhaba!” yazılır.
  • 3 saniye dolduktan sonra konsola “Notification!” yazılır.

Callback hell

Callback hell(cehennem) kavramı, callback fonksiyonlar içerisinde tekrar asenkron fonksiyonların ardı ardına çağırılmasıyla oluşan karışık ortama verilen isimdir.

İşlemler dizisi şu şekilde olsun:

  • Ayarlar dosyasını oku ve API url bilgisini al.
  • API url talebi gönder ve iş listesini al.
  • Listedeki iş listesini başka bir API’ye Post olarak gönder
fs.read("settings.json", function(error, result){
    http.get(result.toDoUrl, function(toDoResponse){
        toDoResponse.todos.forEach(item=> { 
             http.post(result.customerToDoUrl, item, 
                function(response){
                 console.log(response);
             })
        }); 
    }
})

İşlem adımı ne kadar fazlaysa iç içe geçen işlemler dizisi o kadar uzun olacaktır.

Javascript programlama dilinde callback hell’den kurtulabilmek ya da daha düzenli hale getirebilmek için Promise yöntemi uygulanmaya başlandı. Ancak bu sefer de promise hell oluşmaya başladı.

Bu sorunlardan bizi kurtaran modern javascript kavramı async/await olmuştur.

async/await

Yukarıdaki işlemi async/await ile aşağıdaki şekilde de kullanabiliriz.

const settings = await fs.read("settings.json");
const todoResponse = await http.get(result.toDoUrl);

todoResponse.todos.forEach(item => { 
     const response = await http.post(result.customerToDoUrl, item);
     console.log(response);
})

ArcGIS Subtype Kullanılan FeatureClass üzerinde Domain Kullanımı

7 Oca

ArcGIS platformunda oluşturulan coğrafi veri tabanları (geodatabase) üzerinde attribute domain’ler oluşturarak veri tabanındaki bütün FeatureClass’lar üzerinde kullanabilirsiniz. Attribute domain’ler FeatureClass üzerinde tanımlanan filed veri tipi ile uyumlu olmalıdır. Çünkü her attribute domain bir veri tipine sahiptir. Bu veri tipleri:

  • Short
  • Long
  • Float
  • Double
  • Text

Örnek bir attribute domain aşağıdaki gibi tanımlanabilir.

Burada “su_tipi” adında bir attribute domain oluşturulmuştur. Aldığı değerler ise code ve description alanlarına doldurulmuştur.

Hazırlanan attribute domain, bir feature class içerisindeki field üzerine aşağıdaki şekilde eklenip defalut değeri seçilebilir.

Artık siz içmesuyu ana hat çizimi yaparken su tipleri otomatik olarak “Arıtılmış” değerlerini almış olacaktır.

Dikkat

Ancak, eğer tanımladığınız feature class(şekilde içmesuyu ana hattı) üzerinde oluşturduğunuz bir subtype varsa attribute domain değerleri otomatik olarak gelmeyebilir. Bu durumda Arcgis Pro üzerinde attribute domain neden çalışmıyor diye düşünebilirsiniz. Ancak Arcgis Pro üzerinde subtype oluşturulduğunda her type için farklı attribute domain özelliği tanımlayabilme yeteneği getirilmiştir. Bu nedenle siz her bir subtype için değerleri yeniden belirlemek durumunda kalabilirsiniz. Eğer tanımlamazsanız çizim yaparken attribute değerleriniz null olarak gelebilir.

Yukarıdaki içmesuyu ana hat feature class üzerinde “*hat_tipi” field biraz daha koyu renkle ve “*” ile işaretlenmiştir. Bunun nedeni, hat_tipi alanında bir subtype tanımlanmış olmasıdır. Bu durumda her bir subtype üzerinde attribute domain tanımlamalarını tekrar gözden geçirmek durumunda kaldım. Eğer attribute domain tanımlamanızı, subtype oluşturduktan sonra yaptıysanız bu ayarları mutlaka kontrol etmelisiniz.

Subtype ekranında her bir su_tipi alanının belirlenmiş olduğunuzda artık bir sorun ile karşılaşmazsınız.

Neden Geliştiriciler Apple Mac ürünlerini Tercih Eder?

15 Ara

Yazılım ve sistem geliştirici seviyesindeki kullanıcılar genelde Apple Mac ürünlerini tercih ederler. Geliştirici dünyasında en sık görünen ürün ise MacBook laptoplardır. Uluslararası sunumlar, webcast gibi aktivitelerde genelde Apple logosu görünür.

Bunun tercihin sebepleri en genel hatlarıyla nelerdir?

Kullanıcı Dostu

Mac bilgisayarlar gerek dış görünüm ile gerekse macOS işletim sisteminin kullanıcı ara yüzü ve programların kullanıcıyı cezbeden görüntüsü ile kullanıcıların ilgisini çekmektedir.

Donanım Kalitesi

Ekran kalitesi göz alıcı ve çekici. MacBook bünyesindeki alüminyum şase termal özellikleri mac işletim sistemi ile birleştiğinde Mac bilgisayarlar PC bilgisayarlardan daha serin çalışır.

MacOS işletim sistemi Windows işletim sistemine göre daha verimli olduğundan pil ömrü avantajıyla önemli bir tercih sebebidir.

DPI ölçekleme Mac bilgisayarlarda kusursuz gibidir. Mac üstünde 4k doğrudan çalışır.

Fiyat Avantajı

Mac’ler aslında uzun vadede daha ucuzdur. Dolar kurundan dolayı ülkemizde her zaman bu avantaja sahip olamıyoruz. Yurt dışında durum böyle değildir. Elbette, daha az dolar ödeyerek bir Windows PC satın alabilirsiniz. Ancak gerçek sahip olma maliyeti, yalnızca ürünü edinme maliyetine değil, aynı zamanda onu sattıktan veya takas ettikten sonra kalan değere göre de hesaplanmalıdır. Üç yıl önce satın alınan Windows PC ile üç yıl önce satın alınan Mac’in bugünkü değeri karşılaştırıldığında durum anlaşılabilir. Ayrıca Apple ürünlerinin hatalı çıktığında Apple tarafından ücretsiz yenisi ile değiştirilmesi de önemli bir avantajdır.

Güvenilirlik

MacBook işletim sistemi macOS olarak adlandırılır ve Apple bilgisayarlar için oluşturulmuştur. Apple yalnızca kendi işletim sistemlerinin tek başına oluşturduğu Mac, iPad, iPhone, Watch, TV gibi küçük bir aygıtlar listesine destek vermektedir. Yazılım ve donanım birbiriyle uyumlu çalışır ve bu nedenle MacBook çok kararlıdır. Buna karşılık Windows, 1000 üzerinde cihaza destek verir. Bu durum Apple ürünlerinin daha uyumlu, verimli ve güvenilir bir deneyim sunmasını sağlar.

Güvenlik

Virüsler için endişelenmenize de gerek yoktur çünkü macOS için çok fazla virüs yoktur. Ancak yine de MacBook’unuzda entegre ek güvenlik özellikleri de vardır. Apple, sistemin güvenli ve güvenilir kalması için macOS’u düzenli olarak günceller.

Uzun Süreli Destek

Eski model Mac bilgisayarlarda bile en son iOS sürümünü çalıştırmak mümkün olabilmektedir. Bu durumu Windows çalıştıran PC’lerde görmek zordur. Yeni bir windows sürümü yayınlandığında eski bir bilgisayarın video sürücüsü desteklenmeyebiliyor. Windows dizüstü bilgisayar üreticileri genellikle bir aygıt üretir ve sürmekte olan sürücü güncellemelerini ve hata düzeltmelerini görmezden gelir. Apple’ın bakımlı donanım ekosistemi, uzun süreli sürücü desteği sağlamaya yardımcı olur. Bununla birlikte, Microsoft’un Surface çizgisini genişlettiğini görmek çok güzel, bugünün Mac aygıtlarıyla aynı uzun vadeli desteğin tadını çıkarmayı planlıyor.

Çevre Birimleri

MacBook Pro, ek bir kablo ile Dual 4K ekranlar ve monitör aynı USB-C kablosuyla makinenize güç sağlar.

Bash Komutları

MacOS işletim sistemi kullanışlı bir terminale sahiptir ve bash komutlarını çalıştırmaktadır. Terminal ve bash komutları geliştiriciler için çok önemlidir.

Bash komutları MacOS işletim sisteminin dosya yapısına uygundur. Her ne kadar windows işletim sisteminde de bash komutları çalışsa da alt taraftaki dosya yapısı buna uygun değildir. Linux ve macOS üzerinde benzer bash komutları çalıştırılabilir. Her iki işletim sistemi de aynı kökenden (Unix) gelse de yıllar boyu süren geliştirilme safhalarından sonra bile kullanıcı alışkanlıkları ve komut yapıları pek değiştirilmemiştir.

Git ve türevi versiyon kontrol sistemleri de yine ek gereksinime ihtiyaç duymadan doğrudan terminal üzerinden kullanılabilmektedir.

Geliştirme Ortamı

MacOS, web sunucularının çoğu tarafından kullanılan yerel bir UNIX ortamına sahiptir. Bu nedenle aynı ortama sahip bir macOS bilgisayarda geliştirme yapmak önemlidir. Bu sayede MacBook bilgisayarda geliştirilen kodlar sunucuda da sorunsuz çalışacaktır.

Geliştiricilerin kullandığı araçların çoğu Unix’ten geliyor ve MacOS işletim sisteminde UNIX’in gücünü kullanmak konforlu bir geliştirme sağlar.

iOS ve OS X uygulamaları geliştirmek ve yayınlamak için Mac bilgisayarlara ihtiyaç duyulur. MacOS bilgisayarlarda Windows ve Linux için yazılım oluşturmak ve test etmek büyük bir çaba gerektirmez, bu arada OS X’i bir Windows veya Linux bilgisayarda çalıştırmak oldukça zahmetlidir.