Javascript Array.prototype.slice.apply(arguments)

2 Tem

Geleneksel programlama dillerine göre bir çok yönden farklılık gösteren Javascript dilinde nesne oluşturma fonksiyonlar yardımıyla yapılır. Javascript dilinde, function tipleri normal programlama dillerindeki class benzeri işlev görür. Bir function tipinden yeni bir nesne oluşturmak için new anahtar sözcüğü kullanılır. function tipine dışarıdan gönderilen argümanlar arguments isimli bir iç değişkende tutulur. Aşağıdaki örnek, bir fonksiyona gönderilen argümanları listeleme işlemini göstermektedir.


function f(){
   return arguments;
}

console.log(new f());      // Ekrana [] yazar.
console.log(new f(1,2));   // Ekrana [1,2] yazar.
console.log(f(1,2));       // Ekrana [1,2] yazar.

Ekrana yazım şekilleri her ne kadar Array tipinde görünse bu diziler Array nesnesinin özelliklerini taşımazlar. Yani:


function f(){
   return arguments;
}

console.log(f(1,2) instanceof Array);    // Ekrana false yazar.

Çünkü oluşturulan nesneler Array tipinin push, pop, slice benzeri prototype özelliklerini taşımazlar. Bir fonksiyonun arguments üyesini Array tipine dönüştürmek için Array.prototype.slice.apply(arguments) şeklinde kullanmak gerekmektedir. Bu şekilde kullandığımızda, nesne içerisindeki argümanlar Array tipine dönüştürülmüş olur. Yani bu yöntem ile Array olmayan fakat ona benzeyen nesneleri Array tipine dönüştürür.


function f(){
   return arguments;
}

console.log(Array.prototype.slice.apply(f(1,2)) instanceof Array)
// Ekrana true yazar.

Bu özellikler Javascript dilinde ileri seviye işlemlerde önem arz etmektedir. Örneğin kütüphaneler oluştururken bizim sınıflarımızı kullanan kullanıcıların gönderdiği parametreleri bu şeklide alıp değerlendirmek durumunda kalabiliriz. Açık kaynak javascript kütüphanelerini inceleyerek dilin daha fazla özelliğini kavramak mümkündür.

Bir sonraki yazıda görüşmek dileğiyle.

 

Javascript Class ve Nesne Oluşturma

1 Tem

Javascript programlama dili, geleneksel programlama dillerindeki gibi gelişmiş özelliklere sahip olmasa da nesneye yönelik programlama açısından son derece esnek bir yapıya sahiptir. Bu yazıda nesneye yönelik programlamada önemli bir yer tutan class yapısını incelemeye çalışacağız.

Javascript dilinde class benzeri tanımlamalar fonksiyonlar yardımıyla yapılmaktadır. Class benzeri diyorum çünkü geleneksel programlama dillerindeki gibi class tanımlamak için özel bir yöntem yoktur. Her fonksiyon bir class olarak değerlendirilebilir ve her fonksiyonun new anahtar sözcüğü ile bir nesnesi oluşturulabilir.

1-Fonksiyon Tanımlamak

Normal bir Javascript fonksiyonu tanımlayarak aşağıdaki gibi bir class oluşturabiliriz.


function Map(name){
    this.name = name;
    this.version = "1.0.0";
    this.zoomLevel = 0;
    this.zoomin = zoomIn;
}

function zoomIn(){
    return this.zoomLevel + 1;
}

Yukarıda tanımlanan bir constructor fonksiyondur. Aynı zamanda class olarak değerlendirilir.  Bu class tipinde bir nesne aşağıdaki gibi oluşturulabilir.


var map = new Map("myMap");
map.version = 1.1.1;
map.zoomin();

2-Anti Pattern

Yukarıda tanımlama da zoomIn metodu Map calss dışında ayrı bir şekilde tanımlandığından  bir anti pattern oluşmaktadır. Kodun çalışması açısından hiç bir sorun yoktur. Ancak dışarıda tanımlanan her metod, global namespace içerisinde yer alacağından başka bir amaçla aynı isimde (zoomIn) bir metod tanımlandığında bu durum bir isim karışıklığına sebep olacaktır. Bu tür kirliliklerin önüne geçmek adına ihtiyaç duyulan metodlar constructor fonksiyonların içerisine tanımlanmalıdır.

function Map(name){
    this.name = name;
    this.version = "1.0.0";
    this.zoomLevel = 0;
    this.zoomin = function(){
           return this.zoomLevel + 1;
    }
}

Bu şekilde bir tanımlama kodda her hangi bir değişikliğe sebep olmayacaktır.

3-Metodların Prototype Şeklinde Tanımlanaması

2. maddede olduğu gibi metodları constructor fonksiyon içerisine tanımlayarak anti pattern oluşumundan kurtulmak mümkündür. Ancak bu durumun karşımıza çıkardığı bir dezavantaj vardır. Her nesne oluşturulduğunda zoomin() metodu yeniden oluşturulacaktır. Bu dezavantajı ortadan kaldırmak için zoomin() metodu prototype olarak tanımlanmalıdır.

function Map(name){
    this.name = name;
    this.version = "1.0.0";
    this.zoomLevel = 0;
}

Map.prototype.zoomin = function(){
    return this.zoomLevel + 1;
}

4-Doğrudan Nesne Tanımlamak

Şu ana kadar olan bölümlerde constructor fonksiyonlar yardımıyla sınıf simülasyonları olşuturduk ve new anahtar sözcüğü ile bu constructor fonksiyonlardan nesneler oluşturduk. Bu bölümde doğrudan nesneler tanımlamayı inceleyeceğiz.

Javascript dilinde doğrudan nesne tanımlamak object literal olarak geçer. Doğrudan oluşturulan  nesnelerden new anahtar sözcüğü ile tekrardan nesneler oluşturulamaz. Doğrudan bir nesne oluşturmak:

  var obj = {};

veya

  var obj = new Object();

şeklinde yapılabilmektedir.

Dizler için doğrudan nesne oluşturmak:

  var arr = [];

veya

  var arr = new Array();

şeklinde yapılır.

Herhangi bir sınıf tanımlamadan Map nesnesini doğrudan oluşturmak mümkündür.

var map = {
    this.name = name,
    this.version: "1.0.0",
    this.zoomLevel: 0,
    this.zoomin: function(){
        return this.zoomLevel + 1;
    }
}

Artık bu nesneyi doğrudan kullanmak mümkündür.

   map.version = 1.1.1;
   map.zoomin();

Bu tür tanımlamalar singleton olarak da geçer.

5-Fonksiyonlar Yardımıyla Singleton Nesne Tanımlamak

var map = new function(name){
    this.name = name;
    this.version = "1.0.0";
    this.zoomLevel = 0;
    this.zoomin = function(){
           return this.zoomLevel + 1;
    }
}

Burada tanımlanan constructor fonksiyonunun önünde new anahtar sözcüğü kullanıldığında doğrudan bir nesne oluşturulmuştur.

Böylece Javascript dilinde class ve doğrudan nesne kavramını ve bu türlerin nasıl tanımlandığını ve kullanıldığını incelemiş olduk. Bir sonraki makalede görüşmek üzere.

Faydalı Windows ipuçları ve klavye kısayolları

24 Haz

Bu yazıda Windows işletim sistemini kullanırken sıklıkla başvurduğum ipuçlarını sizlerle paylaşmak istedim. Microsoft işletim sistemlerinde bütünlüğü sağlamak adına klavye kısayolları ve işletim sistemi ayarları standarttır. Bu standartlar bize hız kazandırmak için geliştirilmektedir. Şimdilik aklıma gelen ipuçlarını paylaşıyorum, yenileri olduğunda yazıyı güncellemeye çalışacağım.

1- Pencere Ön İzleme Kısayol Tuşu Alt+P

Bir pencere açıkken Alt+P tuşları ile pencere içindeki dosyaların ön izlemesi yapılabilir.

Pencere Önizleme
Pencere ön izleme

2- Pencereyi Konumlandırma Window+Yön Tuşları

  • Window + Left Aktif pencereyi ekranın sol yarım köşesine konumlandırır.
  • Window + Right Aktif pencereyi ekranın sağ yarım köşesine konumlandırır.
  • Window + Top  Aktif pencereyi tam ekran yapar.
  • Window + Down  Aktif pencereyi minimize eder.
Window yön tuşları
Window yön tuşları

3- Ekran Büyüteç Aracı Window+Artı Tuşu

Window ile birlikte artı tuşuna bastığımızda ekrana bir büyüteç penceresi gelir. Bu pencere açıkken Window+ veya Window- ile ekran boyutunu ayarlamak mümkündür.

Büyüteç
Büyüteç kısayolu

4- Pencerelerin Ekran Ön İzlemesi Window+T Tuşu

Açık pencerelerin windows ortamında küçük helde ön izlemelerini görüntülemek için Window+T tuşunu kullanabilirsiniz.

Ön bakış
Ön bakış

 

5- Adım Kaydedicisi psr.exe

Windows Başlat menüsündeki arama satırına psr.exe yazıp enter’a basarak hata kaydediciyi çalıştırabilirsiniz. Kaydı başlatın, bilgisayarınızı kullanın ve hata olduktan sonra kaydı bitirip, HTML slayt gösterisini istediğiniz kişiyle paylaşın.

Adım Kaydedicisi
Adım Kaydedicisi

6- Boş sürücüleri gizleme ayarı

Klasör seçeneklerinden Boş sürücüleri sakla seçeneğinin işaretini kaldırarak, Bilgisayarım penceresinde görünen boş sürücüleri görünmez yapabilirsiniz.

Boş sürücüler
Boş sürücüler

 

7- Bilgisayarım Penceresi Kısayolu Window+E Tuşu

8- Windows’u KilitlemeWindow+L Tuşu

9- Açık Pencereler Arasında Gezinme Alt+Tab Tuşu

10- İnternet Tarayıcısında(IE, Chrome, Firefox), Tab Pencereleri  Arasında Geçiş için Ctrl+Tab Tuşu

11- Tüm pencereleri küçültüp masa üstüne geçmek için window+D tuşu

C# MSMQ Mesaj Yönetimi, Okuma Yazma İşlemleri

21 Haz

MSMQ teknolojisi ile alakalı bir önceki yazıda MSMQ tanıtımını yapmış ve Windows işletim sistemlerine nasıl dahil edildiğini incelemiştik.

Bu yazıda ise mesajların MSMQ kuyruğuna nasıl yazıldığını ve kuyruktaki mesajların nasıl okunduğunu incelemeye çalışacağız.

Öncelikle mesaj nedir bundan bahsedelim. MSMQ teknolojisindeki mesaj kavramı aslında bir programlama dili ile oluşturulan nesnelerin serileştirilmiş halleridir. Bir nesne binary veya xml gibi formatlarda serileştirilebilir. Serileştirilmiş nesneler MSMQ gibi mesaj tabanlı iletişim ortamlarında mesaj olarak değerlendirilir.

MSMQ sisteminde mejsalar kuyruk denilen bir dizgede tutulur. Kuyruklar günlük hayattaki posta kutularına benzer. Postacı gelip zarfı posta kutusuna bırakır. Daha sonra ev sahibi gelip kutudaki zarfı açarak mesajı okuyarak ne yapacağını anlar ve gereğini yapar.

C# programlama dili ile MSMQ kuyruğundaki mesajları yönetmek mümkündür. Windows işletim sisteminde MSMQ kuyruğunu bilgisayar yönetimine girerek Private Queue seçeneğinden görüntüleyebiliriz.

MSMQ
MSMQ

.Net Framework içerisinde System.Messaging namespace altında mesaj trafiğini yönetebilecek tipler bulunmaktadır.

MessageQueue tipine ait üyeler yardımıyla sistemde bir kuyruk mevcut mu diye kontrol edilebilir, mevcut değilse yeni kuyruk oluşturulabilir. Mevcut kuyruğa bir mesaj eklenip, kuyruktan bir mesaj alınabilir. Aşağıdaki örnek kod ile kuyruğa mesaj yazma işlemi gerçekleştirilmektedir.

MessageQueue messageQueue = null;

if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
    messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
else
{
    // Kuyruk oluştur.
    MessageQueue.Create(@".\Private$\EmailQueue");
    messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}

messageQueue.Send("Bu ilk bir MSMQ mesajıdır", "Title");

Kuyruktaki mesajları okumak senkron veya asenkron şekilde yapılabilmektedir. MessageQueue tipine ait aşağıdaki metodlar:

  • BeginPeek()
  • BeginReceive()

asenkron şekilde mesajları okumaya olanak sağlar. bu mesajların override edilmiş şekilleri burada mevcuttur.

BeginPeek() metodu çağrılmadan önce PeekComplated event handler oluşturmak gerekir ki okunan mesajın içeriğine erişebilelim. Aynı şekilde BeginReceive() metodu çağrılmadan önce ReceiveComplated event handler oluşturmak gerekir. BeginPeek() ile alınan mesajlar kuyruktan silinmezken BeginReceive() ile okunan mesajlar kuyruktan silinir. Bu fark, süreçleri yönetmek açısından önemlidir. Aşağıdaki örnek kod, tek bir mesajın kuyruktan asenkron olarak alınmasını sağlar. BeginReceive() kullanıldığı için alınan mesaj kuyruktan silinecektir.

MessageQueue messageQueue = null;

if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
    messageQueue = new MessageQueue(@".\Private$\EmailQueue");
    messageQueue.ReceiveCompleted += new
           				ReceiveCompletedEventHandler(EmailReceived);
    messageQueue.BeginReceive();
}

private static void EmailReceived (Object source,
            ReceiveCompletedEventArgs asyncResult)
{
    MessageQueue mq = (MessageQueue)source;
    Message m = mq.EndReceive(asyncResult.AsyncResult);
    Console.WriteLine("Message: " + (string)m.Body);
}

MessageQueue tipinde senkron bir şekilde mesaj almak için aşağıdaki metodları kullanılabilir:

  • Peek()
  • Receive()
  • GetAllMessages()

Yani Peek() veya Receive() metodu çağrıldığında kuyruktan bir mesaj gelene kadar başka işleme geçilmez. Oysa asenkron metodlarda BeginPeek() veya BeginReceive() komutlarından sonra başka işlem varsa onlar yürütülebilmekteydi.

GetAllMessages() metodu kuyruktaki tüm mesajları getirmek için kullanılır.

 MessageQueue queue = new MessageQueue(@".\Private$\EmailQueue");

 Message[] msgs = queue.GetAllMessages();

 foreach(Message msg in msgs)
 {
     Console.WriteLine(msg.Body);
 }

Mesaj kuyruğuna bir text yerine bir nesneyi göndermek mümkündür. Bu işlem için öncelikle serileştirilecek olan tipin belirlenmesi gerekmektedir. Serileştirilecek olan tip aşağıdaki şekliyle Email adında belirlenmiş ve [Serialize] attribute ile imzalanmıştır.

[Serialize]
public class Email{
     public string From {get; set;}
     public string To {get; set;}
     public string Body {get; set;}
}

Bu nesnenin bir örneğini kuyruğa eklemek için aşağıdaki gibi bir yöntem izlenir.

Email mail = new Email{
   From = "sender@mail.com",
   To = "receiver@mail.com";
   Body = "Merhaba bu bir test mesajıdır.";
};
MessageQueue messageQueue = null;

if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
    messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
else
{
    // Kuyruk oluştur.
    MessageQueue.Create(@".\Private$\EmailQueue");
    messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}

Message message = new Message();
message.Formatter = new BinaryMessageFormatter();

messageQueue.Send(message);

Temel olarak MSMQ mesaj yönetimi bu şekilde yapılmaktadır. Buradaki örnekler yazma ve okuma işlemlerini gösteren tek bir uygulama gibi anlaşılabilir. Ancak dağıtık mimarilerde kuyruğuna yazım işlemini bir uygulama yaparken, kuyruğu sürekli kontrol etme işlemini işletim sistemine bağlı bir servis sağlıyor olabilir. Ya da zamanlanmış görev mantığı ile çalışan bir client uygulama da kuyruktaki mesajları okuyarak gerekli görevleri yerine getirebilir. Senaryoları tasarlamak tamamen ihtiyaca ve beceriye kalmıştır.

Bir sonraki yazıda görüşmek dileğiyle.

Microsoft Message Queuing – MSMQ Nedir?

12 Haz

Microsoft Message Queuing ya da kısa adıyla MSMQ teknolojisi, aralarında sürekli bir bağlantı gerektirmeyen dağıtık sistemlerde uygulamaların emniyetli bir şekilde iletişim kurmalarını sağlayan bir protokoldür.

Dağıtık sistemlerde çalışan bir uygulama MSMQ üzerinde kuyruğa bir mesaj gönderir ve sıradaki işlemlerden kendi iç sürecini işletmeye devam eder. Sistemde bu mesaja ihtiyacı olan diğer bir uygulama bu kuyruğa giderek ilgili mesaj varsa alır ve kendi sürecini başlatır. Aşağıdaki resimde bu durum bir grafik üzerinde ifade edilmiştir.

MSMQ
MSMQ

Bu sayede birbirinden bağımsız çalışan iki ayrı sistem, birbirlerini beklemeden görevlerini yerine getirebilmektedir.

Örneğin bir web sitesi üzerinde yapılan işlemler sonrasında kullanıcı bilgilendirme amaçlı E-Posta gönderiliyor olsun. E-Posta gönderme işlemi ayrı bir mail sunucu üzerinden yapılacaktır. Kullanıcı, bir üyelik formunu doldurup gönderdikten sonra sürecin tamamlanmasını beklemeye başlar. Bu aşamada form bilgileri veri bankasına yazılır ve kullanıcıya bir bilgilendirme mesajı gönderilir. Ancak E-Posta sunucusu geç yanıt verirse veya arızalı durumda ise kullanıcının kayıt süreci yarım kalacaktır ve eksik bir işlem yapılmış olacaktır. Bunun sebebi web uygulamasının, ayrık bir sistem olan E-Posta sunucusuna bağımlı olmasıdır. Bu gibi durumları garanti altına alabilmek için kullanıcıya gönderilecek olan E-Posta bilgileri kayıt sürecinde MSMQ sistemi üzerinde kuyruğa eklenir. Bir başka uygulama bu kuyruğu kontrol ederek E-Posta gönderme işlemlerini gerçekleştirir. Yani iki ayrık sistem birbirinden izole hale getirilerek çalışma süreçleri birbirini etkilememiş olur.

MSMQ teknolojisinin kullanım amacı, dağıtık sistemlerde asenkron ve birbirinden bağımsız süreçler oluşturarak performans artışı sağlamaktır. Dağıtık sistemde çalışan bileşenlerden bir veya birkaçının devre dışı kalması durumunda sistemin iç süreçlerinin devam edebilmesi garanti altına alınabilmektedir. Ağa sürekli bağlı olmadan yürütülen işlemlerde sonuçlar sisteme mesaj şeklinde aktarılabilir ki buna sahada satış yapmak için kullanılan uygulamalar örnek verilebilir.

Kullanım alanları:

  • Kritik öneme sahip uygulamalar. Örneğin E-Ticaret, Bankacılık gibi.
  • İş akışlarının oluşturulduğu uygulamalar.
  • Gömülü sistemler.
  • Sahada satış, sipariş uygulamaları.

MSMQ teknolojisi işletim sistemi üzerinde Windows özelliği olarak gelmektedir. İsteğe bağlı açılabilen bir özelliktir. Kişisel bilgisayar ve sunucu işletim sistemlerine göre birçok versiyona sahiptir.  Aşağıdaki listede işletim sistemi türlerine göre MSMQ versiyonlarının gelişimi sunulmuştur.

MSMQ Versiyonları:

  • MSMQ 1.0, Microsoft Windows NT, Windows 95, 98 sürümleri üzerinde çalışan versiyondu.
  • MSMQ 2.0, Microsoft Windows 2000 üzerinde çalışan versiyon.
  • MSMQ 3.0, Microsoft Windows XP Professional ve Server 2003 ailesi üzerinde çalışan versiyondur.
  • MSMQ 4.0 Windows Vista ve Windows Server 2008 üzerinde çalışır.
  • MSMQ 5.0 Windows 7 ve Windows Server 2008 R2 üzerinde çalışır.
  • MSMQ 6.0 Windows 8 ve Windows Server 2012 üzerinde çalışır.
  • MSMQ 6.3 Windows Server 2012 R2 üzerinde çalışır.

Windows 7 veya Windows 8 gibi kişisel işletim sistemlerinde MSMQ özelliğinin açılması Denetim Masası -> Programlar ve Özellikleri -> Windows Özelliklerini Aç veya Kapat linkinden açılan pencereden yapılmaktadır.

Windows 8 MSMQ
Windows 8 MSMQ

Windows 2008 veya 2012 gibi sunucu işletim sistemlerinde ise Server Manager -> Features -> Add Feature linkinden açılan pencereden seçerek yapabiliriz.

Windows 2008
Windows 2008

MSMQ özelliği işletim sistemine eklendikten sonra Bilgisayar Yönetimi menüsünden görüntülenebilmektedir.

MSMQ
MSMQ

Bir sonraki yazıda görüşmek üzere.

Kaynak: https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

Konumsal Veritabanlarına Özel SRID Eklemek

4 Haz

Mekansal veri depolayabilen veri tabanlarında SRID değerlerini listelemeyi ve herhangi bir tabloya ait geometri alanının SRID değerini güncellemeyi bir önceki yazımızda incelemiştik.

Oracle, PostGIS ve MsSQL gibi sık kullanılan veritabanlarında varsayılan olarak gelen bir çok SRID değeri mevcuttur. Bu SRID değerleri dünyada çok bilinen referans sistemlerine aittir. Ancak bazı ülkeler bu referans sistemleri yerine kendi özel referans sistemlerini kullanmayı tercih etmektedirler. Dolayısıyla bu özel referans sistemleri Çok bilinen SRID listesine dahil olmayabilir. Bu gibi durumlarda özel mekansal referansları veritabanlarına kendimiz eklemek durumunda kalırız.

Spatial Reference sitesi üzerinde aradığımız referansları bulabilmek mümkündür. Bu yazıda ki örnekte ülkemizde kullanılan IRTF96 koordinat sisteminin PostGIS veritabanına nasıl tanımlandığını inceliyor olacağız. Buradan ITRF96 projeksiyona ait bilgilere ulaşabilmek mümkündür.

PostGIS veritabanına ITRF96 koordinat sistemini tanıtabilmek için aşağıdaki SQL komutunu kullanmak yeterli olacaktır.


insert into spatial_ref_sys (srid, auth_name, auth_srid, proj4text, srtext)
values ( 97835,
        'sr-org',
        7835,
        '+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs ',
        'PROJCS["ITRF96 / TM27",
          GEOGCS["GCS_ITRF_1996",
          DATUM["D_ITRF_1996",
                 SPHEROID["GRS_1980",6378137.0,298.257222101]],
                 PRIMEM["Greenwich",0.0],
                 UNIT["Degree",0.017453292519943295]],
                 PROJECTION["Transverse_Mercator"],
                 PARAMETER["central_meridian",27.0],
                 PARAMETER["latitude_of_origin",0.0],
                 PARAMETER["scale_factor",1.0],
                 PARAMETER["false_easting",500000.0],
                 PARAMETER["false_northing",0.0],UNIT["m",1.0]]');

Artık bu SRID değerini veritabanındaki tablolarımızın geometri alanlarına uygulayabiliriz.

Konumsal Veritabanı Tablolarında SRID Düzenlemesi

1 Haz

Coğrafi bilgi sistemleri uygulamalarında veritabanı içerisinde tutulan veriler, metinsel boyutunun yanında coğrafi boyutu yönünden de ele alınmaktadır. Coğrafi veya konumsal veya mekansal olarak adlandırılan verileri depolamak bu verilerin bazı özelliklerini bilmeyi ve kullanabilmeyi gerektirmektedir.

Bu yazıda coğrafi verilerin SRID özelliğini konu edinmiş olacağız. SRID açılımı “Spatial Reference System Identifier” ve Türkçe meali “Mekansal Referans Sistem Tanımlayıcısı” olan bir kavramdır. SRID coğrafi veri tutan tablolardaki geometri alanlarına ait projeksiyon sistemlerini belirtmek için kullanılan sayısal bir kimlik numarasıdır.

Bu yazıdaki örnek uygulamalar piyasada şu anda kullanılan popüler veritabanlarından Oracle, Postgresql veya MsSQL tabloları üzerinde bulunan geometri sütunlarının SRID özelliklerini belirlemek şeklinde olacaktır.

Bir veritabanında bulunan SRID listesini görebilmek için farklı veritabanlarına göre aşağıdaki komutlar kullanılmaktadır.

Oracle

SELECT * FROM sdo_coord_ref_sys

PostGIS

SELECT * FROM spatial_ref_sys

MsSql

SELECT * FROM spatial_reference_systems
SRID Listesi
SRID Listesi

Bir veritabanı tablosundaki geometri alanının SRID değerini değiştirmek için aşağıdaki komutlar kullanılmaktadır. Aşağıdaki örnekte tablo adı “roads” ve geometri alanının adı “geom” şeklinde düzenlenmiştir.

Oracle

UPDATE roads T
SET T.geom.SDO_SRID = 4326
WHERE T.geom IS NOT NULL

PostGIS

SELECT UpdateGeometrySRID('roads','geom',4326);

MsSQL

UPDATE dbo.roads SET geom.STSrid = 4326;

Artık “roads” tablosunun “geom” alanı için SRID değeri 4326 olarak düzenlenmiş oldu. SRID değeri düzenlenmemiş olan tablolar için varsayılan değer boş veya sıfır olacaktır. Bu durumda verilerin kullanılması için her defasında dönüşüm yapmak zorunda kalabiliriz. Verilerimizi Google, Bing veya Yandex gibi haritalarda kullanmayı planladıysak bu haritaların SRID değerlerini bilmemiz ve geometri alanlarımızı bu değer ile güncellemeliyiz.

Bir sonraki yazıda görüşmek dileğiyle.

C# LINQ ile Rastgele Şifre Üretmek

4 Nis

Bu yazıda System.Linq kütüphanesinden faydalanarak rastgele şifre üretmenin ne kadar pratik ve basit olduğunu inceleyeceğiz. Bu pratik çözüme burada rastladım ve herkese faydalı olacağını tahmin ederek paylaşmak istedim.

var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
var random = new Random();
var result = new string(
    Enumerable.Repeat(chars, 8)
              .Select(s => s[random.Next(s.Length)])
              .ToArray());

Olayın gelişimini incelediğimizde Enumerable sınıfının Repeat fonksiyonundan faydalanıldığını görüyoruz.

Enumerable.Repeat fonksiyonunun syntax düzeni şu şekildedir:

public static IEnumerable<TResult> Repeat<TResult>(
   TResult element,
   int count
)

Çalışma şekli ise TResult türünde Count kadar tekrar eden bir yığın üretecek şekilde ayarlanmıştır. Örneğin 15 tane “Okul” sözcüğü üret şeklide çalışır.

Yukarıdaki şifre üretmek için oluşturulan örnekte bizim verdiğimiz bir diziden her defasında rastgele bir karakter çekildiği için tekrarlı veri yığını oluşmuyor. Sonuç olarak count değeri kadar karakter içeren bir şifre oluşturabiliyoruz.

Asp.Net Web Api ile JSON sonuçlarını Camel Case şeklinde göstermek

1 Nis

Asp.Net Web Api uygulamalarında action metodlar tarafından JSON formatında sunulan nesneler, C# ile oluşturulan nesnelerin özellikleri şeklinde oluşturulurlar. Yani C# tarafında oluşturduğumuz bir Product tipi şu şekilde olsun.

public class Product
{
   public string Name { get; set; }
   public string Price { get; set; }
}

Bu tipe ait bir nesneyi veya nesne gurubunu Web Api ile dışarı sunmak için:

public class ProductController:ApiController
{
      public IEnumerable<Product> Get()
      {
         return new List<Product>
         {
         new Product{CategoryName = "Notebook", ListPrice = "1250 TL"},
         new Product{CategoryName = "Tablet", ListPrice = "850 TL"},
         new Product{CategoryName = "Monitor", ListPrice = "350 TL"}
         };
     }
}

Şeklinde bir Controller oluşturabiliriz. Bu şekilde uygulamamızın vereceği cevabı inceleyecek olursak:

Sonuç-1
Sonuç-1

Kategori isimleri CategoryName şeklinde, fiyarlar da ListPrice şeklinde büyük harfle başlatılmış şekilde görünmektedir. Çünkü bu serileştirme işlemi C# ile oluşturduğumuz Product tipinin property üyelerine göre yapılmıştır. Diğer bir deyişle sınıfta belirlediğimiz property isimleri nasıl yazılmış ise JSON property isismleri de aynı şekilde olşuturulmuştur.

Ancak Javascript tarafında gelenek olarak nesne isimleri küçük harfle başlayan ve CamelCasing yapısına uygun olarak kullanılmaktadır. Bu işlemi Newtonsoft.Json.Serialization kütüphanesi bizim yerimize gerçekleştirebilmektedir. Bunun için WebApiConfig dosyasında bir düzenleme yapmak gerekmektedir.

public static void Register(HttpConfiguration config)
{

var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();

jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();}

Tekrar çalıştırdığımızda sonuç:

Sonuç-2
Sonuç-2

Visual Studio Solution Template Oluşturmak

25 Mar

Visual Studio geliştirme aracında yeni proje oluşturma seçenekleri arasında proje türüne göre oluşturulmuş hazır şablonlar bulunmaktadır. Sunulan seçenekler Class Library, Console Application, Asp.Net, WCF v.s gibi uzayıp gider. Seçtiğimiz proje türüne göre bir çalışma ortamı otomatik olarak hazırlanır.

New Project
New Project Seçenekleri

Ancak birbirine benzer projeler oluştururken solution içerisine sürekli aynı proje türlerini seçerek oluşturmak zorunda kalırız.

Örneğin bir web projesi için her defasında arayüz katmanı, veri katmanı, test katmanı gibi proje türleri seçilerek işleme başlanabilir. Bunun dışında da katmanlar vardır ama bu yazıda basit olarak üç katmanı ele almak anlaşılırlık açısında uygun olacaktır.

Bu gibi durumlarda kendi proje şablonumuzu olşuturabilirsek işimiz biraz daha kolaylaşmış olacaktır. Yapmamız gereken şey öncelikle bir solution oluşturarak gerekli proje türlerini bu solution içerisine dahil etmek olacaktır.

Solution
Solution

Bu proje şeklini bir şablon haline getirmek için File->Export Template seçeneğini seçerek ilerleyebiliriz.

Export Template
Export Template

Bu işlemin ardından My Exported Templates içerisine DataLayer.zip şeklinde bir dosya oluşturulduğunu görebiliriz. Bu solution içerisindeki tek bir katmana ait şablondur.

vs4

MyTemplate.vstemplate içerisinde oluşturduğumuz şablona ilişkin bilgiler bulunmaktadır. İçeriği xml şeklindedir ve istediğimiz şekilde düzenleyebiliriz. Bu işlemi solution içerisindeki tüm projelere uygulayıp oluşan *.zip dosyalarını tek bir şablon içerisinde birleştirebiliriz.

Export Template işlemi ile tüm projelere ait şablonları oluşturup *.zip dosyalarını bir klasöre çıkartalım.

Template Şablonları
Template Şablonları

Klasörlerin yanına Root.vstemplate şeklinde bir dosya oluşturmamız gerekmektedir. Adının ne olduğu önemli değildir. Önemli olan *.vstemplate uzantısına sahip olmasıdır. İçerik bilgisi ise şu şeklide olmalıdır.

Roor.vstemplate
Roor.vstemplate

TemplateContent içierisindeki ProjectCollection bölümünde daha önce tek tek oluşturduğumuz proje şablonlarını listeliyoruz. Icon olarak belirlediğimiz template.png dosyasını da aynı klasör içine kaydetmemiz gerekmektedir. Son olarak bu klasörü zip şeklinde sıkıştırarak kaydetmemiz gerekmektedir.

Template.zip
Template.zip

Artık oluşturduğumuz My Web Template.zip dosyasını Visual Studio Project Templates içerisine taşıyarak çalışır hale getirebiliriz.

Şimdi Visual Studio ortamında yeni proje eklemeyi deneyelim. Proje adını da ETicaret olarak belirleyelim.

Yeni Proje Şablonu
Yeni Proje Şablonu

Ve mutlu son!

Proje
Proje