16 Aralık 2009 Çarşamba

SQL Sorgu Optimizasyonuna Yardımcı Araçlar

Sorgu optimizasyonu yaparken, her değişiklikten sonra performans bilgisini gözlemleme işlemini tekrarlamak gerekir. Bu gözlem, yapılan değişikliğin performansı iyi mi kötü etkilediğini belirlemeye yardımcı olur.
1. Elapsed Time
Bir sorgunun çalışmak için aldığı zaman uzunluğu ‘Elapsed Time’ olarak adlandırılır. Sorgunun tamamlanma süresini birçok şey etkileyebilir. Tamamlanma süresi en iyi değerlendirme ölçüsüdür, çünkü bu değere kullanıcının sorgu çalışırken bekleyeceği zamandır. Tamamlanma süresini görebileceğimiz ilk yer SQL Server Management Studio’ da sorgu penceresidir. Aşağıdaki gibi görülür.
image
Tamamlanma süresini görebileceğimiz diğer seçenek SET STATISTICS komutunu kullanmaktır. Aşağıda bu komut ile çalıştırılmış sorgu ve sonuç penceresi görünüyor. 

image
Yukarıdaki örnekte SELECT deyiminden önce ‘SET STATISTICS TIME ON’ komutunu kullandık. Sonuç penceresinde ‘Elapsed Time’ bilgisi yanı sıra ‘CPU Time’ bilgisi ve PRINT deyiminin değeri bulunuyor. ‘SET STATISTICS TIME ON’ deyimi, her deyimin parse, compile ve execute işlemlerinin aldığı zamanı görüntüler. Bu deyim az sayıda komut çalıştırılacağı zaman faydalıdır. Eğer çok sayıda satır çalıştırılıyorsa okunması zor bir sonuç elde edilebilir.
2. CPU Time
Bir diğer önemli performans ölçümü CPU miktarıdır. Tamamlanma süresini görüntülemek için de kullandığımız ‘SET STATISTICS TIME ON’ komutu ile her deyimin CPU zamanını da görüntüleyebiliriz. Bu CPU tüketimini ölçmek için ilk yöntemdir.
SQL Server CPU tüketimini ölçmek için kullanılan @@CPU_BUSY sistem değişkenini sunar. @@CPU_BUSY sistem değişkeni SQL Server başlatıldığından itibaren olan çalışmak için harcanan süreyi döndürür. Sonuç CPU zaman artışıdır ve tüm CPU için kümülatiftir, böylece aktif tamamlanma süresini aşabilir. @@TIMETICKS değişkeni ile çarpılarak mikro saniye birimine dönüştürülebilir.
Aşağıdaki örnekte döngülerin çalışma süreleri SQL Server CPU miktarının @CPU_BUSY kullanımı ile ölçen yöntem bulunuyor. @@CPU_BUSY değişkeni SQL Server start edildiğinden itibaren serverda sorgu çalıştıran tüm kullanıcıların ve sistem sorgularının CPU miktarını barındırır. Bu yüzden bu yöntem, sistemde bir komut çalıştırsak ve arka planda başka sorgu çalışmıyorsa doğru sonuç verir.
image
Yukarıdaki örnekte görüldüğü gibi 1 ve 2. döngü CPU miktarını milisaniye biriminden hesapladık. Bu sorguyu farklı zamanlarda her çalıştırdığımda farklı sonuçlar alabilirim. SQL Server’ da çalışan diğer işlemler bu metoda etki eder. Bu metot ile aktif CPU kullanımı hesabı çok doğru bir sonuç vermeyebilir ancak aktivitesi az olan bağımsız sistemlerde işe yarar bir yöntemdir.
SQL Server Profiler kullanarak CPU ölçümü yapmak daha kesin bir yöntemdir. Yukarıda çalıştırdığımız sorgunun Profiler görüntüsü aşağıda görüleceği gibi CPU kolonunda Harcanan CPU miktarı bulunur. CPU değerini görüntülemek için SQL: BatchCompleted eventi kullanarak çalıştırmak gerekir. SQL Profiler sabit olarak süreleri milisaniye olarak görüntüler. ‘Tools/Options’ menüsündeki bir seçenek ile mikro saniye olarak görüntülenecek şekilde değiştirilebilir. Bu metot ile örnek sorgumuzdaki her döngünün miktarını değil sorgunun bütünüyle tamamlandığı miktarı elde ederiz.
image
3. I/O Usage
Diğer performans ölçüleri gibi I/O miktarını da çeşitli TSQL deyimleriyle sorgulamak mümkündür. SQL Server’ da 2 çeşit I/O yolu vardır: Logical ve Physical I/O. Logical I/O hafızadaki tampon alandan işlem gören veriden sorumludur. Physical I/O, SQL Server’ ın depolama için kullandığı fiziksel diskten direk olarak veri erişimi ile ilişkili giriş/çıkışlardır. Fiziksel I/O, işlemler daha uzun zaman aldığı için daha maliyetlidir. I/O genel olarak SQL deyiminin performansına tek başına etki eder yani maliyetlidir. Buna göre sorgu tasarlarken oluşacak result set üreten physical ve logical I/O operasyonlarının sayısını küçültmek gerekir.
TSQL deyimleriyle I/O miktarını görüntülemenin ilk yolu, ‘SET STATISTICS IO ON’ deyimini kullanarak I/O istatistiklerini açmaktır. SQL deyiminin sonucuyla birlikte bu bağlantı süresince SQL deyimine karar vermek için kullanılan I/O sayısını çıktı olarak döndürecektir.
image
Yukarıdaki örnek sorguyu çalıştırdığımızda Logical Read 34 Physical Read 3 olarak gerçekleşti. Şimdi aynı sorguyu ikinci kez çalıştırıp aşağıdaki sonuca bakalım:
image
Yukarıda çıkan sonuca göre sorgu ikinci kez çalıştığında TSQL deyiminin sonucunda Logical Read 34 Physical Read 0 olarak görünüyor. Çünkü bu sorgun verileri tutan database pageleri zaten buffer pooldadır. Performans arttırmak için yapılan testlerde tekrarlayan işlemler yapıyorsak, bu I/O miktarını buffer pooldan okuması işlemini ortadan kaldırmalıyız. Bunun için de “DBCC DROPCLEANBUFFERS” komutunu sorgularımızdan önce çalıştırmalıyız. Bu işlem sorguların SQL Server stop start işlemi yapmadan temiz buffer pool ile çalışmasına imkan sağlar.
Serap PARLAK

Cluster ve clustering nedir? Cluster oluşturmanın faydaları nelerdir? (Bölüm I)

Cluster, basit anlamda benzer bir amaç için belirli bir konfigürasyon yapılarak aynı görevi birlikte ya da yedekli çalışmasını sağlayan servistir. Cluster farklı amaçlarla oluşturulabilir fakat son kullanıcı tarafından her zaman tek bir bilgisayar gibi gözükecektir. Bir cluster oluşturmak için en azından iki adet sunucuya ihtiyaç vardır ve bir cluster içindeki her bir sunucu “node” olarak adlandırılır. İhtiyaç olan hizmete göre çeşitli sayıda nodelar bir araya gelerek clusterları oluşturmaktadır. Bir cluster oluşturmak için gerekli sebepler daha fazla performans ihtiyacı, yüksek erişilebilirlik (high availability) ya da her ikisi birlikte olabilir.
Şimdi cluster çeşitlerini çok fazla ayrıntıya girmeden biraz daha yakından inceleyelim.
Yüksek erişilebilirlik (High-availability) clusterları
Bu tip cluster yapısında öncelik erişilebilirliği arttırmadır. Bunu tek bir sunucunun görevini herhangi bir donanım yada yazılım problemi oluştuğunda diğer bir sunucunun otomatik olarak devralması olarak özetleyebiliriz. Böylece özellikle kritik önem içeren hizmetler (örn: veritabanı yada web servisleri) kesintisiz yada min. kesinti süresiyle hizmet vermeye devam edecektir. Cluster içindeki arızalı sunucuya müdahale edilip tekrar cluster ortamına dahil edilebilmesi sırasında hizmet kesintisiz olarak devam edecektir. Bu özelliği failover olarak adlandırıyoruz.

Yine görüyoruz ki cluster ortamında ne kadar çok node olur ise sağlanılan hizmette ya da serviste kesinti olabilme ihtimalinin de o denli düşeceğidir. Bu cluster yapısında en yaygın olan konfigürasyon iki node ile oluşturulan clusterdır. Aktif-pasif şekilde çalışır. Bu demektir ki bir sunucu sürekli hizmet sağlarken diğeri pasif bir biçimde birinci sunucuda oluşabilecek olası bir soruna karşı arka planda beklemektedir.
Bir sunucunun sürekli bir şekilde pasif halde beklemesi pahalı bir çözüm gibi görülebilir fakat olası bir hizmet kaybında ne kadar sürede sunucu tekrar devreye alınabilir ve bu süre kaybı ilgili kuruluşta yaratacağı maddi ve müşteri gözünde itibar kayıpları ne olacaktır, bunların değerlendirmesi dikkatli bir biçimde yapılmalıdır.
Yük dağıtımlı clusterlar (Load-Balancing clusters)
Bu tarz clusterlarda ise yine birden fazla sunucu belirli bir servis ya da hizmeti oluşan işlem yükünü ortak bir biçimde paylaşarak kullanırlar. Örneğin özellikle microsoft server işletim sistemlerinin desteklediği webserverlar üzerinde kullanılan NLB (network load balancing) örnek olarak gösterilebilir. Burada aynı web hizmetini veren birden fazla sunucu NLB ile sanal bir ip adresi oluşturularak ortak bir havuzda toplanır ve bu ortak ip adresine gelen tüm web istekleri NLB tarafından havuzdaki sunuculara yönlendirilir.
Sıradaki isteğin havuzda bulunan hangi sunucuya ileteceğine NLB karar verir. Web sunucumuz şu anda tüm isteklere karşılık verebilecek kadar güçlüde olsa sonuçta bir tek fiziksel bileşeni temsil ettiğinden oluşabilecek herhangi bir problemde web hizmeti dağılımı hem de failover yapabilmeniz hizmet kalitenizi büyük oranda arttıracaktır. Burada yine sunuculardan birinin devre dışı kalmasını, son kullanıcılarınız fark etmeyecektir.
Diğer cluster türleri
Yukarıda açıklamış olduğumuz cluster yapılarına benzer fakat farklı amaçlar için oluşturulan cluster yapıları da dünyada mevcuttur. Örneğin Formula 1 ya da uçak firmalarının özel simülasyon programlarının yüksek ihtiyaçlarını karşılamak için oluşturduğu cluster yapıları da bulunmaktadır. Ya da daha insani amaçlar için (kanser, aids vb tedavileri) ortak bir merkezde kurulan ve sizin bilgisayarınıza bir client yazılım indirerek çok büyük bir araştırmanın üzerinde işlem yapılmasına ihtiyaç duyulan küçük parçalarını bilgisayarınıza çekerek gerekli hesaplamalar tamamlandıktan sonra tekrar ana merkeze gönderen clusterları da bu yelpazeye ekleyebiliriz. Buradaki amaç bu şekilde dünyanın her yanında ev bilgisayarlarından bir cluster oluşturarak işlem gücü çok yüksek bir süper bilgisayar oluşturmaktır.
Clustering farklı mimariler ve işletim sistemlerinde mümkün olan bir hizmettir fakat bu makalede Microsoft Server ailesi üzerinde clustering yapısına değineceğiz.
Windows server 2008 clustering ile gelen yenilikler
Windows server 2008 ile birlikte cluster yapısında ve kurulumunda önceki işletim sistemlerine göre birçok yenilik ve farklılık gözümüze çarpmakta. Bunlardan ilki artık cluster hizmetinin windows server 2003’te olduğu gibi hazır kurulu şekilde gelmediği. Sunucumuz üzerinde cluster kurmak istiyorsak bunu add feature sihirbazından eklememiz gerektiğidir. Ayrıca cluster hizmetinin yeni kurulum dizini windows klasörü altında cluster dizini olarak değiştirilmiştir.
Diğer yeni bir özellik ise gelişmiş cluster kurulum sihirbazı olarak adlandırılabilir. Bu sihirbaz sayesinde kurulum öncesi işlemci, ağ yapısı, disk konfigürasyonları vb donanım uyumluluğunu test edebilir, clusterınızı oluştururken adım adım nodelar ekleyebilir ve önceden konfigürasyonunu tamamladığınız diskleri kullanmak istediğiniz hizmet yada servis için ekleyebilirsiniz. Aynı zamanda yine bu sihirbaz ile gerek kurulum öncesi gerekse kurulum tamamlandıktan sonra clusterınız hakkında yapılan testlerin sonucunu görebilir microsoftun önerdiği çözümleri ya da tavsiyeleri görebilirsiniz.
Burada alacağınız hata mesajlarının tümü cluster kurulumuna engel olmayacaktır fakat gerçekleştirdiğiniz çözüm Microsoft tarafından önerilmeyebilir. Bir örnek vermek gerekirse eğer cluster için hazırlamış olduğunuz nodelarda sadece tek ethernet kartı mevcutsa bu çift ethernet kartı ile kurulması yönünde uyarı gelecek fakat kuruluma devam edilebilecektir.
Ayrıca güvenliğin arttırılması adına windows server 2008 cluster nodeları server 2003 ve öncesi işletim sistemlerinden oluşan bir cluster içerisine dahil olamamaktadır. 2003 server işletim sistemlerinden oluşan clusterlar server 2008 cluster management içerisindeki migration tool ile server 2008’e güncellenebilmektedir.
Yine ek bir güvenlik özelliği olarak cluster servisi artık domain admin hesabı değil local admin hesabı üzerinden çalışmaktadır. Authentication işlemi ise active directory üzerinde oluşturulan sanal cluster bilgisayar hesapları ile NTLM yerine Kerberos üzerinden denetlenmektedir. Burada özellikle varolan domain controllerınız server 2003 ise çeşitli problemlere karşılaşabilirsiniz. Yazının ikinci kısmı olan kurulum ve konfigürasyon makalesinde özellikle R2 versiyonuda dahil tecrübe edindiğimiz sorunları ve çözümleri sizlerle paylaşacağız.
Server 2003’ten bu yana eklenen yeni bir özellik ise 2003’te bir cluster maksimum 8 node destekleyebilirken server 2008 x64 platformunda bunun 16node a çıkarılmış olmasıdır. Bu özellik, tahmin edebileceğiniz üzere büyük ölçekli kurumsal çözümler için hayati bir önem taşımaktadır.
Yine server 2008 ile artık Windows clusterlar için IPv6 desteği eklenmiştir.
Cluster içerisinde nodeların birbirleriyle habeleşmesini sağlayan heartbeat interface’in haberleşme yapısı broadcastten unicast’e çevrilmiştir. Bu da nodeların farklı ip bloklarında olabilmesini sağlamaktadır. Ayrıca DHCP üzerinden IP adresi alabilme opsiyonu eklenmiştir. Fakat şahsi görüşüm yinede hiçbir sunucunuzu çok özel bir konfigürasyon nedeniniz olmadıktan sonra static ip olucak şekilde configure etmenizdir. Ayrıca heartbeat interface için alive check değeri değiştirilebilir hale gelmiştir bu şekilde bu değer arttırılarak daha yavaş bağlantılar üzerinde bulunan sitelardaki cluster yapılarında da nodeların fail duruma düşmemesi sağlanabilir.
Server 2008 ile gelen bir sürpriz bir değişiklik de artık cluster üzerinde fiziksel disk kullanamamanız. En azından bir adet SAN (Fiber,SAS,iSCSI) diski eklemeniz zorunludur. Bu disk ise clusterın bilgilerinin tutulduğu eski adı quorum yeni adı ile witness disk olarak adlandırılmaktadır. Tavsiye edilen boyut 512Mb-1Gb dır. Ayrıca bir sql server cluster ortamı yaratmak istiyorsak bunun için yine ilgili boyuttaki data disklerininse sql kurulum öncesinde ayarlanması ve server 2008 içerisindeki iscsi initiator kısayolundan server üzerine eklenmesi gerekmektedir. Ayrıca depolama alanında server 2008le birlikte gelen GPT partition tablolama desteği ile 2 terabyte a kadar partition desteği gelmekte.
Referanslar
  • Microsoft clustering white paper
Bora ENGİN

10 Aralık 2009 Perşembe

JOIN Türüne Göre SQL Optimizer Çalışma Mantığı

SQL Optimizer, Joinler için 3 farklı yöntem kullanmaktadır:
1. Nested Loop : Bir tablonun (outer table) tüm satırlarını döner ve her satır için diğer tablonun(inner table) satırlarını dönerek eşleştirmeye çalışır. Kayıt sayıları az olduğunda en iyi performansı verir. Right ve Full Outer Join bu yöntemi kullanmaz. Input tablonun büyüklüğü çarpı Output tablonun büyüklüğü maliyetle orantılıdır. Algoritma mantığı aşağıdaki gibidir:
for each row R1 in the outer table
    for each row R2 in the inner table
        if R1 joins with R2
            return (R1, R2)
2. Merge Join : Aynı anda iki tablonun birer satırını okuyup karşılaştırarak eş zamanlı çalışır. Ancak iki tablonun join keylerinin sıralı olması zorunludur. “T1.a = T2.b” şeklinde bağlandıysa t1 in a, t2 nin de b kolonuna göre sıralı olması gerekmektedir. Tüm join tiplerini destekler. Kayıt sayısıyla maliyeti orantılıdır. Büyük kayıtlar için iyi sonuç verir. Input tablonun büyüklüğü maliyetle orantılıdır. Algoritma mantığı aşağıdaki gibidir:

get first row R1 from input 1
get first row R2 from input 2
while not at the end of either input
    begin
        if R1 joins with R2
            begin
                return (R1, R2)
                get next row R2 from input 2
            end
        else if R1 < R2
            get next row R1 from input 1
        else
            get next row R2 from input 2
    end
3. Hash Join : Diğer iki çalışma şeklinden daha maliyetlidir. Sıralı olmayan büyük verilerde kullanılır. İlk tablonun tüm satırlarını okur, hash anahtarı yaratır ve bellekte yarattığı hash tabloya yazar. Sonra diğer tablonun satırlarını dönerek, her satır için hash anahtarı yaratır ve hash tablodaki değerlerle karşılaştırır. En maliyetli join türüdür. Algoritma mantığı aşağıdaki gibidir:
for each row R1 in the build table
    begin
        calculate hash value on R1 join key(s)
        insert R1 into the appropriate hash bucket
    end
for each row R2 in the probe table
    begin
        calculate hash value on R2 join key(s)
        for each row R1 in the corresponding hash bucket
            if R1 joins with R2
                return (R1, R2)
    end
View içerisindeki sorgularda INNER JOIN kullandığımızda, SQL optimizer “Hash Join” yapmaya karar verir. Büyük ve sıralı olmayan bir data olduğundan bu yöntemi seçer. Left join yaptığımızda ise Optimizer, Nested Loop yapmaya karar verir ve bu çok daha hızlı çalışmaktadır. Bilişim dünyasında her durumun tek bir doğrusu olmaması burada da geçerlidir. Çözüm olarak;  indeksleri düzenleyerek dataları sıralı hale getirebilir veya uygulamanın ihtiyacına göre LEFT JOIN kullanabiliriz.
Serap PARLAK

9 Aralık 2009 Çarşamba

Aynı SQL Veritabanını Birden Fazla Sunucuda Kullanma

Zaman zaman gerek performans açısından, gerekse farklı nedenlerle aynı veritabanına farklı sql sunuculardan erişme ihtiyacı doğar. Burada karşımıza farklı seçenekler çıkar. Bunlara kısaca bakacak olursak:
1. Mirroring
2 (principal, mirror) veya 3 sunucu ile (principal, mirror, witness) kurulur. Principal ve mirror sunucular sql standard veya enterprise edition olmalıdır. Witness olan sunucu ise sql express edition bile olabilir. Ancak witness sunucu varsa yüksek bulunurluk olabilir. Üç farklı şekilde kurulabilir:
  1. Yüksek bulunurluk (witness sunucu ile senkron veritabanı)
  2. Yüksek koruma (witness sunucu kullanmadan senkron veritabanı)
  3. Yüksek performans (witness sunucu kullanmadan asenkron veritabanı)
Mirror olan veritabanına erişilemez (aktif olmadığı sürece recovering statüsünde kalır Bir veritabanının sadece bir tane mirror kopyası olabilir. Mirror olan veritabanından sadece okuma yapmak için snapshot alınabilir. Özellikle uzak lokasyona mirror alınıyorsa uygun bir çözümdür.

2. Snapshot
Sadece snapshot alındığındaki anlık bilgiyi içerir. Boyut olarak daha ufaktır (commit edilmemiş transactionları içermez). Her snapshot alındığında veritabanının tamamı transfer edildiğinden, ufak veritabanı için uygundur. Sadece okuma yapılabilir.
3. Log Shipping
Kritik olmayan veritabanları için veri kurtarma çözümüdür. İki veya daha fazla sunucu ile kurulur (primary ve standby). Sunucular sql standard, enterprise, workgroup veya developer edition olabilir. Simple recovery ile çalışmaz. Full veya bulk-logged olmalıdır. Otomatik transfer işlemleri için her iki sunucuda da Sql Agent çalışıyor olmalıdır. Logların kopyalanması için okuma/yazma yetkisi olan ortak bir disk alanı olmalıdır. Sql Agent servisini çalıştıran kullanıcının bu ortak alana okuma/yazma erişimi olmalıdır. Standby veritabanından okuma yapılabilir.

image
Şekil 1. Log shipping
4. Merge Replication
Üç farklı replikasyon yönteminden (transaction, merge, snapshot) en çok kullanılanıdır. Veri çalışması olabilecek mobil uygulamalar veya dağıtık sunucu uygulamaları için kullanılır. Çakışan veriler, tanımlı kurallara göre birbirini ezebilir. Diğer yöntemlerden farklı olarak:
  1. Veriler dışındaki objeler de (kullanıcılar, yetkiler, vb) taşınır
  2. İki veri tabanına da yazma yapılabilir
Sonuç olarak, her yöntemin kendi içinde artıları ve eksileri olduğundan, uygulamanın ve bize sağlanan ortamın özelliklerine göre (sunucu sayısı, kullanıcı sayısı, lokasyonlar, okuma veya yazma yapılacağı vb) işimizi görecek en performanslı yöntem tercih edilmelidir.
Necmettin TÜRER

6 Aralık 2009 Pazar

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz.
UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir.
image
Şekil 1. Class Diyagram
Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Amaç, diyagramın sadece belirli kısımlarının (sınıf özelliklerinin ve işlevlerinin) gösterimini sağlamaktır. Bir sınıf diyagramında kullanılabilecek temel yapılar bunlar olmasına rağmen "constraints" ve "notes" dediğimiz elemanlar da mevcuttur. Notes(Notlar) genellikle işlevlerin ve özelliklerin hakkında bilgi veren opsiyonel kutucuklardır. Constraints (koşullar)'ler ise sınıfa ilişkin birtakım koşulların belirtildiği ve parentez içinde yazılan bilgilerdir.

image
Şekil 2. Örnek daire sınıfı
Şekil2’deki sınıf diyagramını incelerken +, - işaretleri görülmektedir. Sınıf diyagramında yer alan nitelik ve method isimlerinin önünde aşağıda sıralanan bezelemer (adornments) kullanılabilir.
  • Private (-); Nitelik yada metota sınıf dışında erişim engellenmiştir.
  • Protected (#); Nitelik yada metota erişim sınırlandırılmıştır.
  • Public (+); Nitelik yada metot genel kullanıma açıktır.
Sınıf diyagramları kendi başlarına bir şey ifade etmez ancak aralarındaki ilişkilerle birlikte incelendiklerinde anlamlıdır. UML içerisinde sınıflar arasında 4 farklı ilişki tanımlanabilir;
  1. Bağlantı İlişkisi (Association)
  2. Genelleme/Kalıtım İlişkisi (Generalization/Inheritance)
  3. Bağımlılık İlişkisi (Dependency) (Aggregation, Composition)
  4. Gerçekleştirim İlişkisi (Realization)
1. Bağıntı İlişkisi (Association Class)
Bağıntı ilişkisi, sınıf diyagramlarında en çok kullanılan ve en basit ilişki türüdür. Çoğu zaman referans tutma biçimindedir. İki nesne arasında varolan bağıntının çokluları (n:m), ilişki bağıntı sınıfı ile ifade edilebilir. Bağıntı ilişkisi iki nesne arasına çizilen düz çizgi ile belirtilir.  Bağıntı  ilişkileri için tanımlanmış bilgiler aşağıdaki gibidir;
  • Bağıntının Adı
  • Sınıfın bağıntıdaki rolü
  • Bağıntının çokluğu
Bağıntı adı, iki sınıf arasındaki ilişkinin küçük bir açıklamasıdır. Bu açıklama ile birlikte yön bilgisi de belirtilebilir.

image
Şekil 3. Bağıntı ilişkisinde bağıntı adı ve yönü
Sınıf diyagramlarında sınıflar arasında bire n ilişki kurulabilir. Bir sınıf, n tane başka bir sınıf ile ilişkiliyse buna bire-çok (1-n) ilişki denir.
image
Şekil 4. Bağıntı ilişkisinde çokluk gösterimi
Şekil4’de işçi-işveren ilişkisinde bir şirketin en az bir işçisi olduğu (1..*), bir işçinin ise 0 ya da herhangi bir sayıda(*) şirkette işçi olarak çalışmış olabileceği ifade edilmektedir. İki sınıf arasında yanlızca tek bir bağıntı çizilmesi gibi bir kısıt yoktur. En temel bağıntı ilişki tipleri aşağıdaki gibi listelenebilir;
  • Bire-bir
  • Bire-çok
  • Bire-bir veya daha fazla
  • Bire-sıfır veya bir
  • Bire-sınırlı aralık (mesela:bire-[0,20] aralığı)
  • Bire-n (UML de birden çok ifadesini kullanmak için '*' simgesi kullanılır.)
  • Bire-Beş yada Bire-sekiz
Diğer bir ilişki türü ise bir sınıfın kendisiyle kurduğu ilişkidir.Bu tür ilişkiler genellikle bir sınıfın sistemde birden fazla rolü varsa ortaya çıkar.Bu tür ilişkilere "reflexive associations" denir. Bu tür bir ilişki UML ile aşağıdaki gibi gösterilir (Manidar bir örnek:));
image
Şekil 5. Reflexive ilişki örneği
Şekil5’i inceleyecek olursak , patron bir eleman olmasına rağmen kendisi gibi eleman olan birden çok çalışandan sorumludur diyebiliriz.
2. Sınıflar Arasında Türetme (Inheritance) ve Genelleme (Generalization) İlişkisi
Nesne tabanlı programlama tekniğinin en önemli parçası türetme (inheritance) dir. Türetme yoluyla bir sınıf başka bir sınıfın var olan özelliklerini alarak, o sınıf türünden başka bir nesneymiş gibi kullanılabilir. Bir sınıfın işlevleri türetme yoluyla genişletilecekse, türetmenin yapılacağı sınıfa taban sınıf (base class), türetilmiş olan sınıfa da türemiş sınıf (derived class) denir. Şekilsel olarak türemiş sınıftan taban sınıfa bir ok olarak belirtilir.
image
Şekil 6. UML’de türetme örneği
UML 'de türetme Şekil 6’da gösterilmiştir. Türetme ağacında daire ve kare birer şekildir. Sınıflar arasındaki türetme işlemi ucu açık üçgen ve düz bir çizgiyle gösterilir. Bu durumda "Şekil" sınıfı ana sınıf (parent class), daire ve kare ise yavru (sub class) sınıflardır. Türetmeye sınıflar arası ilişki açısından baktığımızda türetmenin "is kind of" (bir çeşit) ilişkisinin olduğu görülür.
Nesneler arasında ortak özellikler varsa bunu her sınıfta belirtmenin yerine ortak özellikleri bir sınıfta toplayıp diğer sınıfları ondan türetip yeni özellikler ekleyerek organizasyonu daha etkin hale getirebiliriz. Tabi istersek ortak özelliklerin toplandığı sınıf ile gerçek nesneler oluşturmayı engelleyebiliriz. Bu tür sınıflara "abstract class" denir. Bir sınıfın "Abstract" olması için Sınıf ismini italik yazmamız gerekmektedir.
3. Bağımlılık İlişkisi (Dependency) (Aggregation, Composition)
3.1. İçerme (Aggregations) Bağıntı İlişkisi
Birden fazla parçadan oluşan sınıflar arasındaki ilişkiye "Aggregation" denir. Aggregation ilişkisini 'bütün parça' yukarıda olacak şekilde ve 'bütün parça'nın ucuna içi boş elmas yerleştirecek şekilde gösteririz. İçi boş elmas ile gösterilen ilişkilerde herbir parça ayrı bir sınıftır ve tek başlarına anlam ifade ederler.
image
Şekil 7. İçerim ilişki örneği
3.2. Oluşum (Composition) Bağıntı İlişkisi
Parça bütün arasında çok güçlü bir ilişki yoktur. Ama bazı durumlarda bütün nesneyi yarattığımızda parçalarının da yaratılmasını isteriz. Bu tür ilişkilerin gösterilmesine ise "COMPOSITE ASSOCATION" denir. Bu ilişki diğerine göre daha güçlüdür. Bu tür ilişkilerde bütün nesne yaratıldığında parçalar da anında yaratılır. Bazı durumlarda, takılacak parçalar duruma göre değişebilir.Bu durumda takılacak parçalar "constraint(koşul)" ile belirtilir.
image
Şekil 8. Oluşum ilişki örneği
Uygulamada oluşum ve içerim bağıntılarının kimi durumlarda birbirine karıştığı görülmektedir. Bunun nedeni, oluşum bağıntısınınaslında içerim nağıntısının daha güçlü bir biçimi olmasıdır. Her oluşum bağıntısı aslında aynı zamanda bir içerim bağıntısıdır. Belirleyici fark ise iki bağıntı türünün nesneleri birbirine bağlama gücü arasındaki farktır. İki bağıntı türü arasındaki farkları inceleyelim;
  • Oluşum bağıntısında her parça aynı anda sadece tek bir bütüne ait olabilir. Bu nedenle oluşum bağıntısında bütün tarafı çokluk değeri daima 1 olmak zorundadır. İçerim bağıntısında ise bir parçanın birden fazla bütün tarafından paylaşımı söz konusu olabilir.
  • Oluşum ilişkisinde parçanın yaşam süresi doğrudan bütünün yaşam süresine bağlıdırç Bütün nesnesi yaratılmadan parça nesnesi yaratılamaz ve bütün tarafındaki nesne silindiğinde parça nesnelerde onunla birlikte silinmelidir.
Aşağıda çeşitli bağıntı türlerinin bir arada kullanıldığı örnek bulunmaktadır.
image
Şekil 9. Genel bağıntı örneği
Yukarıdaki bağıntıda aşağıdaki ilişkiler yer almaktadır;
  • Her okulun sıfır ya da daha fazla öğrencisi yeralmaktadır.
  • Her okulda bir ya da daha fazla bölüm vardır.
  • Her bölüm tek bir okula bağlıdır.
  • Her bölüm bir ya da daha fazla sayıda ders açmaktadır.
  • Her bölüm bir ya da daha fazla öğretim üyesine sahiptir.
  • Her bölümün öğretim üyelerinden seçilmiş bir başkanı vardır.
  • Her öğretim üyesi bir ya da daha fazla bir bölümde görev yapmaktadır.
  • Her öğretim üyesi sıfır ya da daha fazla sayıda ders vermektedir.
  • Her ders bir ya da daha çok bölüm tarafından açılır.
  • Her dersi sıfır ya da daha fazla sayıda öğrenci almaktadır.
  • Her derse en az bir tane öğretim üyesi atanmıştır.
  • Her öğrenci bir ya da daha fazla sayıda okula kayıtlıdır.
  • Her öğrenci sıfır ya da daha fazla sayıda ders alabilir.
  • Her öğretim üyesi ya tekbir bölümün başkanıdır ya da hiçbir bölümün başkanı değildir.
4. Gerçekleştirim (Realization) İlişkisi
Gerçekleştirim lişkisi en çok kullanıcı arayüzlerinin (user interface) modellenmesinde kullanılır. Arayüz yanlızca method adlarını ve bunların parametrelerini içermektedir. Program yazarken, yanlızca arayüzlerin kullanılması ve arayüzü gerçekleştiren sınıfın diğer sınıflardan ayrı tutulması, yazılımın geliştirilmesi ve bakımında önemli kolaylık sağlar. Gerçekleştirim ilişkisi kesikli bir çizginin ucuna yerleştirilen içi boş bir üçgen ile gösterilir.
image
Şekil 10. Gerçekleştirim ilişkisi
Yukarıdaki örneği inceliyecek olursak; IHesapla adı verilen ve diğer sınıfların kullanımına açılmış arayüz sınıfı tanımlanmıştır. Bu sınıfta yer alan metotların gerçekleştirimi ise Hesapla sınıfı tarafından üstlenilmiş durumdadır. İyi yapılan bir tasarımda tüm sınıflar yanlızca arayüzde yer alan metotları kullanmalı, doğrudan Hesapla sınıfının metotları çağırılmamalıdır. Böylece Hesapla sınıfının gerçekleştirimi, uygulamamnın kalanını etkilemeksizin istendiği gibi değişebilir. Arayüzlerin diğer bir yararı arayüzün gerçekleştirimini yapan sınıfın kaynak kodunu, sınıfı kullanan diğer programcılar tarafından erişilmesi gereğini ortadan kaldırmasıdır. Bu nedenle arayüz sınıfları, kod gizliliğini sağlamak isteyen yazılım firmaları tarafından yaygın biçimde kullanılmaktadır.
Sınıf İlişkileri Özet Tablosu
No
İlişki
Örnek Gösterim
Açıklama
1 Bağıntı(Association) image İki sınıfın herhangi bir şekilde birbirleriyle iletişim kurmasıdır. Örneğin : Öğrenci ve Okul arasındaki ilişki
1.a Çokluk (Multiplicity) image İki sınıf arasındaki 1:n ilişkidir. Birden fazla öğrencinin okul ile olan ilişkisi olarak çıklanabilir. Şekildeki * işareti 1:n ilişkiyi göstermektedir.
1.b Yönlü Bağıntı (Directed Association) image Sınıflar arasındaki tek yönlü ilişkiyi gösterir. Ok işareti ile gösterilir.
1.c Dönüşlü Bağıntı(Reflexive Association) Belirgin bir çizimi yoktur. Bir sınıfın kendisiyle kurduğu ilişkidir.Bu tür ilişkiler genellikle bir sınıfın sistemde birden fazla rolü varsa ortaya çıkar
2 Kalıtım/Genelleme(Inheritance/Generalization) image Bu ilişki, bir nesnenin bir diğerinin özel bir türü olduğu gerçeğini modellemek için kullanılır.
3 İçerme(Aggregation) image İki sınıf arasındaki “sahiptir” veya içerir türünden bağıntıları modellemekte kullanılır.Bütün parça içi boş elmas ile gösterilir.
3.a Oluşum(Composition) image İçerme ilişkisinin farklı bir çeşitidir. Tüm bağıntılar içinde en güçlü olanıdır. Parça-bütün ilişkilerini modellemekte kullanılır.
4 Gerçekleştirim(Realization) image Kullanıcı arayüzlerinin modellemesinde kullanılır. Arayüz yanlızca method adlarını ve bunların parametrelerini içermektedir.
Bir sonraki makalemizde UML diyagramlarından State (Durum) diyagramlarını ayrıntılı inceleyeceğiz.
Referanslar
Neslihan ÇALIŞKANEL

23 Kasım 2009 Pazartesi

Exchange Server 2010 ve Genel Avantajları Üzerine

Microsoft Exchange Server 2010 kurularak; izleme, filtreleme, kota koyma vs. gibi bir çok yönetimsel özellik sayesinde, gerek Bilgi Teknolojileri departmanı için gerekse şirket çalışanlarına, daha üretken, etkili, verimli ve güvenli bir iş ortamının sağlanmasını hedeflenir. Genel avantajları aşağıdaki gibidir;
Gelişmiş spam mail koruması
  • Intelligent-Defense  özelliği ile spam e-postaların toplam hacmini azaltılması.  Bu yol ile mail sunucu spam epostaları toplu olarak ortadan kaldırır, eposta için kullanılan kaynağı düşürür, harcanan band genişliğini azaltır ve gereksiz depolanmanın önüne geçer.
Exchange sunucu ile birlikte Outlook üzerinde Sharepoint ile entegrasyon
  • Gelen kutusu, takvim, görev listesi gibi kullanıcı alanlarının istenilen kişilerle paylaşılarak ortak ve etkin bir çalışma alanı yaratılabilmesi
  • Sharepoint üzerinde depolanan bilgilere herhangi bir zamanda her hangi bir yerden ulaşabilme imkânın olması
Uzak kullanıcılar için daha etkin Outlook kullanımı
  • Outlook Anywhere ile VPN’e alternatif olarak RPC over http yöntemi ile şirket dışında bulunan çalışanların mail sunucusuna Outlook ile kolay ve hızlı bağlantı sağlayabilmesi.
  • Outlook Web Application ile Outlook yazılımına ihtiyaç duymadan herhangi bir internet bağlantısına sahip bilgisayardan outlooktaki bir çok fonksiyondan feragat etmeden kullanıcıların mailine erişim ve çalışma ortamına katılma şansı.
  • Active sync desteği ile cep telefonu, PDA gibi mobil cihazlara https sertifikası ile güvenli push mail imkânı. Böylelikle uyumlu mobil cihazlardan şirket mail hesabını kullanabilme imkânı.

Yönetimsel seçenekler ve kolaylıklar
  • Yöneticilerin kullanıcı maillerini üzerinde çeşitli rule tanımlamaları vasıtasıyla maillerin iletilmesini onaylayabilmesi ya da engelleyebilmesi.
  • Sesli mail gönderme/alma ve bunların yazıya çevrilebilmesi.
Güvenlik ve Performans
  • Exchange 2010 ile eski sürümlere nazaran I/O işlemlerinde %30 performans artışı.
  • Exchange sunucusunun daha düşük maliyetli ve etkin biçimde yedeklenebilmesi.
  • Temel sorunları çözmek için kullanıcılara belirli haklar devredebilme.
  • Varolan hosting sistemine kıyasla birçok yeni hizmet, filtreleme ve güvenlik seçenekleri.
Virüs Koruması
  • Exchange sunucu işletim sistemi için Microsoft forefront client security, Exchange yazılımı için Microsoft forefront for Exchange kurulumu gerçekleştirilecektir. Microsoft partnerlik kapsamında elimizde olan ilgili yazılımın lisansları ücretsiz olarak kullanılabilecektir.
Bora ENGİN, Necmettin TÜRER, Deniz KILINÇ

22 Kasım 2009 Pazar

“Response.Redirect”, “Server.Transfer”, “Response.RedirectParmanent” Karşılaştırma

ASP.NET uygulamalarında bir sayfadan diğer sayfaya geçişte kullanılan bu methodların çalışma mantıkları oldukça farklıdır. Detayları bilinmediği zaman birbirleri yerine kullanılabilirler ve beklenmedik/istenmeyen maliyetlere neden olurlar. Dolayısı ile ihtiyaca göre doğru yerde kullanılmaları önemlidir.
1. Response.Redirect(“New.aspx”)
Bir sonraki sayfaya geçiş için sunucu-tarayıcı arasında fazladan bir tur atılır. Toplam tarayıcı-sunucu arasındaki tur sayısı (roundtrip) 2’dir. İlk sayfa tarayıcıdan tamamen kaybolur. Eğer session, cache, querystring veya serialization benzeri yöntemlerle bilgileri taşımadıysanız, ilk sayfadaki hiç bir bilgiye ulaşamazsınız. Tarayıcınızda yeni sayfanın URL bilgisi yazar. Roundtrip artsa da daha “temiz” bir yöntemdir. Response status olarak 302 (Found- “Asked resource is temporarily moved to other location”) bilgisi döner (tarayıcı eski URL’den yeni resource’u sormaya devam eder). Yeni sayfada oluşabilecek F5/page refresh problemlerini önlenir ve daha karmaşık uygulamalardaki AJAX requestlerinde problem yaşanmaz. Bu komut ile web sitenizin dışındaki harici bir URL adresine de yönlendirme yapabilirsiniz. HttpWatch ile izlenen sonuçlar aşağıdaki gibidir;
image

2. Server.Transfer(“New.aspx”)
Sunucu tarayıcı arasında tek request ile akış tamamlanır. Performans daha iyidir. Bu komutta yönlendirme yapılmaz. Talep edilen ikinci sayfa, ilk sayfanın sonuna eklenerek render edilir (birinci sayfa ikinci sayfayı üretir), yani aşağıdaki gibi bir durum söz konusudur;
Server.Execute("New.aspx", Response.Output);
Response status olarak 200 bilgisi döner. Birinci sayfa, tarayıcıda korunduğu için sayfa üzerindeki bilgilere ulaşmak mümkündür. AJAX requestlerinde problem yaşar ve büyük ihtimalle javascript hatası alırsınız. Yalnızca web siteniz içindeki sayfalar arasında yönlendirme yapmak için kullanılır. HttpWatch ile izlenen sonuçlar aşağıdaki gibidir;
image
3. Response. RedirectParmanent (“New.aspx”)
ASP.NET 4.0 ile birlikte gelen yeni methodlardan biridir. Response.Redirect ile aynı mantıkta çalışır. Yine bir sonraki sayfaya geçiş için sunucu-tarayıcı arasında fazladan bir tur atılır. Farklı olarak response.status 301 (Moved Parmanently-Asked resource is temporarily moved to other location”) bilgisi döner (tarayıcı eski URL’den yeni resource’u sormaya bırakır). Response.redirect’e göre daha efektif olduğu söylenebilir. Kod bloğu aşağıdaki gibi simule edilebilir;
Private Sub RedirectParmanent(ByVal response As HttpResponse, ByVal absoulteURI As String)
        response.Clear()
        response.Status = "301 Moved Permanently"
        response.RedirectLocation = "new.aspx"
        response.End()
    End Sub
HttpWatch ile izlenen sonuçlar aşağıdaki gibidir;
image
Özetle; “Hangi komutu kullanmalıyım?” sorusunun cevabını direk vermek mümkün değildir. Klasik “It depends” (ne yaptığınız ve ne yapmak istediğinize bağlı olarak tüm koşullarınızı düşünmelisiniz) ile cevaplamak en doğrusudur.
Referanslar
Kaynak kod indir
Deniz KILINÇ

21 Kasım 2009 Cumartesi

Applocker İle Daha Güvenli Bir Ağ

Bu makalemizde Windows 7 ile birlikte gelen yeniliklerden biri olan applocker uygulamasından bahsedeceğiz. Applocker ağ yöneticilerine kullanıcılarının istemli ya da istemsiz bir şekilde bilgisayara herhangi bir sebepten ötürü kurabileceği yazılımlara kısıt getirilebilmesini sağlar. Bu kısıtlamada amaç sistem bütünlüğüne zarar verebilecek her türlü programın bilgisayara yüklenmesinin önüne geçerek ileride ağ yöneticileri için oluşabilecek sorunları meydana gelmeden ortadan kaldırmaktır. Ek olarak paylaşım programlarıyla şirket internet bant genişliğinin azalmasının yada bilgisayardaki gereksiz yazılımda oluşabilecek performans düşüşünün önüne geçilmiş ve BT masasına gelecek yardım telefonlarının oranında azalma ve daha verimli çalışma ortamı sağlanmış olmaktadır. Bu da demektir ki zararlı diye tabir edebileceğimiz yazılımın kurulması engellenerek hem ağ yöneticisinin sorunu gidermesi esnasında hem de kullanıcının bu sırada bilgisayarını kullanamamasından ötürü oluşan zaman ve iş gücü kaybının önüne geçilmiş olur.



Applocker’da ayrıca kullanıcının, sadece bir programın bütünü değil sadece belirli bileşenlerini yahut sürümlerini kullanabilmesi ya da kullanmasının engellenmesi de sağlanabilir. Örneğin Bora kullanıcısına Microsoft Office paketi içerisinde Access ve Visio programını kullanamamasını sağlayabilirken aynı zamanda adobe readerın yalnızca 9 ile başlayan sürümlerini yükleyebilmesini sağlamakta mümkündür. Yine applocker ile kurulabilecek programları belirli bir klasöre yapılacak path tanımlamasıyla belirtmek de olasıdır. Yazılımcılar için ek bilgi vermek gerekirse applocker sadece executables yani programın uygulama kısmına müdahale edebilir. DLL kısmı bunun dışında kalacaktır. Bu duruma engel olmak için DLL tanımlamaları da desteklenmektedir. Tüm bunlar göz önüne alındığında şirket ağı içerisindeki her kullanıcı bilgisayarı belirlenmiş bir şirket politikası ve standartları üzerinde yazılım çalıştırmış olacaktır.




Applocker Konfigürasyonu



Applocker konfigürasyonunda kural yani “rule” mantığı geçerlidir. Sistem yöneticileri şirket ihtiyaçları doğrultusunda çeşitli kurallar oluşturarak hangi kullanıcı grubunun hangi yazılımları kullanabileceğini belirler. Kuralları oluştururken 4 farklı kombinasyondan yararlanabiliriz. Bunlar birlikte kullanılarak istenilen tüm senaryolar gerçekleştirilebilir. İlk olarak İzin ver “Allow” kuralına bakalım. Allow kuralında bir kullanıcı ya da kullanıcı grubuna bir yazılımı kullanma hakkı vermek istediğimizde seçmemiz gereken seçenektir. Örneğin Muhasebe departmanına muhasebe yazılımları için allow kuralı yazıldığında bu departmanda tanımlı kişiler ilgili programları kullanabilme hakkına sahip olacaktır.



 Bunun tam tersi ise Reddet (Deny) olarak geçer. Bu kuralı da adından anlaşılacağı üzere herhangi bir kullanıcı ya da kullanıcı grubuna bir programı kullanmaktan men etmek için rule tanımlaması yapmakta kullanacağız. Örnek vermek gerekirse bir departmanının müzik dinlemesini engel olmak, winamp ve windows media player programları üzerine deny kuralı tanımlayarak gerçekleştirmek mümkündür.



Şimdi burada dikkatimizi vermemiz gereken asıl nokta, etkili rulelar yazmak için bir özelliğe daha ihtiyacımız olduğudur. Çünkü bir önceki örnekte olduğu gibi müzik dinlenmesine engel olmak için en bilinen iki yazılımı yasaklamak başlı başına bir çözüm içeremez bunun nedeni ise birçok alternatif programın piyasada bulunması bunların tek tek deny ya da allow edilerek listeye eklenmesinin ise büyük zaman ve çaba gerektirdiği gerçeğidir. İşte burada devreye istisnalar yani “exceptions” girmektedir. Bu özellik kullanılarak belirli bir yazılımın bütünü ya da bir parçası kullanımı için bir allow rule yazılabilir ve exceptions kısmında da kalan tümünün yasaklanması sağlanabilir. Aynı durum tersi bir senaryo için de geçerlidir. Örneğin bir kullanıcı ya da kullanıcı grubuna sadece Office içindeki Excel uygulamasına izin vermek isteniyor ise Excel uygulaması için allow rule yazılarak exceptionda kalan tüm uygulamalar deny olarak gösterildiğinde ağ yöneticisi word, access, Project, power point şeklinde tek tek tanımlama yapmayarak olası zaman kaybından kurtulmuş olacaktır.



Konfigürasyon için başlat çalıştıra mmc yazarak mmc konsolu açıyoruz. Burada yukarıda dosya menüsünden Ek bileşen ekle/kaldır menüsünü seçiyoruz. Buradaki listeden grup ilke nesne düzenleyicisini seçerek ekle butonuna basıyoruz. Daha sonra tamam diyerek yeni açılan pencereden de son ve tekrar tamam dedikten sonra karşımıza bilgisayarımızın Yerel bilgisayar ilkesi konsol eklentisi gelmekte. Bu seçenek ağacını resimdeki gibi genişleterek yukarıda bahsettiğim ayarların tümüne ulaşabilirsiniz.
image
Bora ENGİN

20 Kasım 2009 Cuma

Teknoloji ve Yazılımla İlgili Özlü Sözler

İnternette dolaşırken bulduğum bir takım güzel sözleri biraraya getirip sizlerle paylaşmak istedim. Benim çok hoşuma gitti, hepsi farklı şekilde yorumlanabilir, tartışılabilir :)
No code is faster than no code.
Merb Core Tenent
Software: do you write it like a book, grow it like a plant, accrete it like a pearl, or construct it like a building?
Jeff Atwood
I will not break my back or my sanity on Windows troubleshooting any more.
Jamis Buck
Premature parameterization is the square root of all evil.
Sean McGrath
I do believe I have post-traumatic Java syndrome.
Renae Blair
Deleted code is debugged code.
Jeff Sickel
Good software architects are like condoms… bad software architects are like Viagra.
Sidan
Nobody hates software more than software developers.
Jeff Atwood
Longevity is a big part of credibility.

Jason Calacanis

If you can’t sell your product, it’s not a product–it’s a hobby.
Jason Calacanis
Agile is not just about speed.
Jack Milunsky
I can’t choose whether someone is offended by my actions. I can choose whether I care.
Martin Fowler
So, what does it mean for teaching and learning programming when the solution to every beginner problem is available on the Internet?
Cay Horstmann
One of my most productive days was throwing away 1000 lines of code.
Ken Thompson
Not all code needs to be a factory, some of it can just be origami.
_why
If you program and want any longevity to your work, make a game. All else recycles, but people rewrite architectures to keep games alive.
_why
The best way to market yourself is to be remarkable.
Chad Fowler
Chase the vision, not the money.
Tony Hsieh
If you are single and you want to do startups, stay single. Stay single for a while, startups can be all consuming 24/7 suck you dry.
Steve Blank
You can’t build everything and there is no more a killer feature. Everyone has a different killer feature.
Matt Mullenweg
The biggest motivation is not the money but the impact.
Matt Mullenweg
"Doesn't matter how well your software is designed and written, if it runs slow and doesn't get the job done then it is trash."



A Good Developer is;
A) Gets along with the rest of the team and B) Does efficient and effective work
It's not about what methodology they follow or technology they use, it's about whether they "gel" with the environment, being the other people in the team, and are effectively keeping the client happy. (accurate, robust [non-fragile] code.) Anything else is gravy provided it doesn't negatively affect point A or B.
Deniz KILINÇ

19 Kasım 2009 Perşembe

HttpWatch ile Sniffing

Tüm web uygulamaları, Http veya Https protokolleri üzerinden çalışırlar. En basit uygulamada bile HTML sayfasının üzerindeki grafikler ve scriptler için web sunucusuna birden fazla Http Request gönderilir. Dolayısı ile profesyonel uygulamalarda, tarayıcı ile web sunucusu arasındaki Http paketlerinin incelenebilmesi oldukça önemlidir. En çok kullanım alanları;
  • Arıza arama (Trouble shooting)
  • Performans ayarlama (Perfermance tuning) 
  • Web sitesinden akan bilgilerin güvenliği olup olmadığını inceleme
HttpWatch programı, Internet Explorer ve Firefox gibi tarayıcılarla entegre çalışarak, web sayfalarına her erişimde gelen-giden Http paketlerinin izlenmesini sağlar. Eğer https üzerinden güvenli bir siteye bağlanırsanız, kullanıcıların göreceği şekilde paketleri otomatik olarak decrypt eder. Geleneksel network izleme programları sadece düşük seviye network verilerinin (low-level data) izlenmesini sağlarken, HttpWatch programı optimize edilmiş Http verilerinin hızlı ve anlaşılabilir şekilde görülmesine imkan verir.
Program aracılığı ile basitçe neleri görebiliriz;
  • Bir web sitesi yüklenirken oluşnan tüm istekleri
  • isteklerin adreslerini (URL)
  • isteklerin zamanlarını (Time)
  • isteklerin sonuçlarını (404, 304, ...) (Result)
  • isteklerin ne kadar dosya boyutuna sahip olduklarını (Sent/Received)
  • isteklerin türlerini (type)
  • ortalama raporları
HttpWatch programını kurduktan sonra, “Internet Explorer—>Tools” altından veya internet explorer açıkken “Ctrl+F2” kısa yol tuşu ile web sitelerini izlemeye başlayabilirsiniz. Aşağıdaki şekilde, Univera web sitesinden (EnRoutePanorama, EnRoutePlus tanıtım ekranları) bir ekran açılarak, basit bir izleme örneği gösterilmiştir.
image
Şekil 1. Örnek HttpWatch ekranı
Referanslar
Deniz KILINÇ, Ali KALFAOĞLU

OPENXML ile SQL Veritabanında XML Verilerinin İşlenmesi

OPENXML, bir XML belgesi için bize bir rowset görünümü sunarak, Sql Server’da XML verilerinin parse edilebilmesini sağlamaktadır. Parse sonrasında, bu verileri sql sorgularımızda kolaylıkla kullanmamız mümkündür. Özetle; XML içerisindeki verilerin tıpkı veritabanı tablolarındaki satırlar ve sütunlar gibi davranmasını sağlamış oluyoruz.
OPENXML fonksiyonu “sp_xml_preparedocument” sistem stored procedure’ü ile birlikte kullanılmaktadır. Bu prosedür, verilen xml içerisindeki düğümlerin ağaç şeklindeki görünümünü bellek üzerinde oluşturur ve bu çıktı OPENXML fonkiyonu için girdi olarak kullanılır. Bu işlem sırasında  kullanmak isteğimiz XML elementlerine ilişkin derinliği yani XPATH’i belirtmemiz gerekmektedir. OPENXML komutunun avantaj ve dezavantajları aşağıdaki gibidir;
Avantajları:
  • Openxml ile xml’den verileri işlemek hızlıdır.
  • XML belgelerini stored procedurelerde datasource olarak kullanmak içinde oldukça kullanışlıdır.
Dezavantajları:
  • Xml verisini bellek üzerinde işleyebileceği formatla tutarak çalıştığı için boyutu yüksek xml verileri ile çalışırken dikkatli olamak gerekir.
Aşağıdaki örnekte, T.C. Merkez Bankası standart XML’inin (banka/şube bilgileri) parse edilmesi ve veritabanına eklenmesi gösterilmiştir. SSP_CONTROLBANKINFO isimli bir stored procedure yazılmış ve parametre olarak XML string verilmiştir.
CREATE PROC [dbo].[SSP_CONTROLBANKINFO] (@xmlString as ntext,@userKod as int,@islemTarihi as DATETIME)
AS   
BEGIN   
  
DECLARE @idoc as INT
   EXEC sp_xml_preparedocument @idoc OUTPUT,@xmlString   
   DECLARE @BANKASUBETABLE AS TABLE(num VARCHAR(10), BankaKod VARCHAR(10),SubeKod VARCHAR(10),Ad VARCHAR(100),SehirKod INT)   
   -- WITH komutu ile OPENXML'den dönecek row set şemamızı belirtiyoruz.
  INSERT INTO @BANKASUBETABLE   
  SELECT * FROM OPENXML (@idoc, 'csv_data_records/record') WITH (num varchar(10),BKOD varchar(10) 'BKOD',SKOD varchar(10) 'SKOD', NAME varchar(100) 'NAME',CITY INT 'CITY')   
DECLARE @bKod VARCHAR(10)
DECLARE @sKod VARCHAR(10)   
DECLARE @ad VARCHAR(100)   
DECLARE @sehirKod INT   
Declare mycur cursor for SELECT BankaKod,SubeKod,Ad,SehirKod FROM @BANKASUBETABLE   
Open mycur
-- Oluşturduğumuz @BANKASUBETABLE üzerinde dolaşarak
Fetch next from mycur into @bkod,@sKod,@ad,@sehirKod   
While @@fetch_status = 0   
Begin
   Fetch next from mycur into @bkod,@sKod,@ad,@sehirKod    
End     
Close mycur
Deallocate mycur;

-- Bellekten openxml input parametresini işimiz bitince siliyoruz.
EXEC sp_xml_removedocument @idoc     
İşinize yaraması dileğiyle…
Referanslar
Ali Sercan YILMAZ