31 Aralık 2007

2007'nin Bıraktıkları

Blog okuyanlar mutlaka yaşamıştır. Tesadüfen bir kaç ay önce yazılmış gündemle alakalı bir yazıya rastlarsınız. Yazı derinlemesine yazılmış ve onlarca yorum yapılmıştır. Konunun sıcaklığı geçip bir de aradaki geçen zamanın olgunluğu eklendiğinde yorumlar biraz daha duru bir şekilde olur. Ama blogların dinamikleri itibariyle o kadar eski bir yazıya yorum yapamazsınız. Ama insan kendi yazdığı yazıya yorumlar ve eklemeler yapabilir galiba :) Ben de bu kategoriye giren bir kaç yazı seçtim bir kaç küçük ekleme yapmak istedim.

Veritabanı ve Pazarlama
İnternetin pazarlama faaliyetlerinde kullanılmaya başlanmasının ülkemiz için yeni olduğunu söyleyebiliriz. Bilgi toplama konusunda zamanla daha doğru düzgün yöntemler kullanılmaya başlanıyor. Ama hala buradaki en ciddi problem bu tarz işlerin teknik olmayan veya yeterli düzeyde donanıma sahip olmayan kişiler tarafından üstlenilip yönlendirilmesi.

Web 3.0 ve Servis Odaklı Mimari
Burada tekrarlamak istediğim şey, bu standartların bir moda gibi düşünülüp kendi başında değerlendirilmemeleri. Kullanım alanına uygun olarak bu parçalardan doğru olanları uygulamalara yerleştirmemiz.

Web 3.0 yazılımcısı olmak
Artık kaliteli uygulamalar için web platformunda web yazılımcılarının değil daha nitelikli yazılımcıların çalışması gerektiğinden bahsetmiştim. Aslında o günlerde piyasada nitelikli yazılımcı bulmanın zorlaştığı bir döneme girdik. Böyle bir ortamda bu ne kadar mümkün olacak tartışılır.

Programlanabilir Web
Google'ın Open Social ile Facebook un karşısındaki gövde gösterisi Türkiye için kayda değer bir sonuç vermedi aslında. Facebook için geliştirilen uygulamalar hızla artıyor. Zamanla artık ayakta kalabilen saman alevi gibi olmayan uygulamarın daha revaçta olacağını düşünüyorum. Ama bunun da ne kadar süreceğini yine bekleyip göreceğiz.

Herkese mutlu yıllar :)

11 Aralık 2007

Veritabanı İsimlendirme Kuralları

Kod yazma standartlarında bazı isimlendirme notasyonları kullanılmaktadır. Database nesneleri için de bazı standartlar önerilmekte. Aşağıda bu standartları derleyip kendi yorumlarıma göre değiştirerek bir kaç madde listelemeye çalıştım. İsimlendirmede genel olarak Pascal Case kullanılmaktadır.

Tablo isimlendirmesi:
  • Tablo isimleri çoğul olmalıdır şeklinde bir kural var. Fakat çift kelimeli tablolar kullandığımızda bir sıralama problemi yaşamamız mümkün. Yani Users ve UserAnswers şeklinde bir sıralamada UserAnswers daha önde olur. Bu yüzden şahsi görüşüm temel tabloları tekil olarak isimlendirmenin daha doğru olduğu yönünde.
  • Birden fazla kelimeli tablo isimlerinde sadece son kelime çoğul olmalıdır. Örneğin UserAnswers.
  • tbl gibi bir prefix hiç bir anlam ifade etmediği için kullanılmamalıdır. Prefix olarak projenin kısaltılması kullanılabilir. Örneğin Google Analytics projesi için GaUser şeklinde bir isimlendirme olabilir.
  • Tablo isimlerinde _ kullanılmamalıdır
  • SQL cümlelerinde SQL terimlerinin tamamı büyük harfle kullanılmalıdır
  • Developer dışında kişilerin de database i kullanma ihtiyacı olacağı için hiç bir kısaltma kullanılmamalıdır
  • Çoka çok ilişkilerde iki tablo ismi de çoğul kullanılması önerilir. Ama son kelimenin çoğul kullanılma kuralı ile karmaşa yaratacağı için bu durumda da son kelimeyi çoğul olarak kullanmak daha tutarlı olacaktır. Örneğin EmployeeCustomers



Kolon isimlendirmesi

  • User tablosu için UserId alanı key alan için kullanılabilir. Fakat SQL Server'da I küçük harfle i nin karşılığı olmadığı için dilimize özgü olarak tüm Id ifadelerinin id olarak yazılmasını öneriyorum. Örneğin Userid,Cityid.
  • Yabancı anahtarların isimleri ana tablodaki alan isimleriyle aynı olmalı. Örneğin City tablosunda alan Cityid olarak kullanıldıysa id değerin tutulduğu User tablosunda da Cityid olarak kullanılmalıdır.
  • Birden fazla alanın PK olduğu tablolarda id isiminde bir alan kullanılmamalıdır.
  • Kolon isminde kln, fld gibi prefixler kullanmak gereksizdir. Sadece alan IntUserid şeklinde alan tipi prefix olabilir ama bu da pek önerilen bir şey değildir.
View isimlendirmesi
  • Vw prefix iyle başlamalıdır.
  • İki tablo join edilerek bir view oluşturuluyorsa isimde iki tablo da kullanılmalıdır.
SP isimlendirmesi
  • Create,Get,Update,Delete,Set gibi fiil ifadeler isimde prefix olarak kullanılabilir. Örneğin GetUserInformation.
  • "sp_", "xp_" veya "dt_" gibi prefixler kullanıldığında önce master tabloya bakılıp aranacağı için bir performans kaybı yaratır. Kesinlikle kullanılmamalıdır.

18 Kasım 2007

Full Text Index

Yoğun sorgulamalarda indeksler bize performans artışı sağlar. Fakat klasik indeksleri her alan tipi için kullanamayız. Text ağırlıklı alanların indekslenmesi için Sql Server üzerinde Full Text Search isimli ekstra bir servis bulunmakta. CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, ve NTEXT alanları indekslenmesini sağlamakta. Tek şart bu indeksin yapılacağı tabloda bir tane tekil alan bulunması.

Full Text Search servisinin algoritmasına ulaşamadım ama tahminimce bu tekil alanla birlikte varolan text ifadenin kelimeler olarak farklı satırlara bölünmesi şeklinde.
Yani
1, "bugün hava güzel"

şeklinde bir kayıt varsa bu kayıt
1, "bugün"
1, "hava"
1, "güzel"

şeklinde 3 kayıt olarak eklenir ve diğer satırlarla birlikte text alan üzerinde tekrar bir indeksleme yapılır. Eğer "bugün" kelimesini sorgularsak direk indekslenmiş datadan sonuç gelir ve içinde "bugün" geçen kayıtlar kolayca bulunabilir. Biz de aslında bu mantıkla kendimize özel servisleri yazabiliriz. Bu şekilde algoritma sadece kendi isteğimize cevap vereceği için daha fazla performans yakalayabiliriz. Tabii ki database sistemleri kendi algoritmalarında sistem üzerindeki kendi nimetlerinden faydalanmakta.

Bir Full Text Index tanımlamak için öncelikle Database-Storage altında yeni bir Full Text Catalog oluşturulur.Database özelliklerinden Files sekmesinde "Use full-text indexing" seçeneği aktif hale getirilir.İstediğimiz kolon üzerinde sağ tuş ile FullText Index ekleyebiliriz.
FREETEXT
FREETEXTTABLE
CONTAINS
CONTAINSTABLE
şeklinde 4 kullanımı var.

SELECT testtable
FROM textcolumn
WHERE FREETEXT (textcolumn, 'bugün' )

textcolumn kolonu üzerinde "bugün" geçen tüm kayıtları listeleyebiliriz. Diğer komutlarla daha farklı seçenekler mevcut.

02 Kasım 2007

Programlanabilir Web

Facebook'un bu kadar hızla hayatımıza girip kullanıcı ve altyapı bazında bazı devrimler yaratmasıyla birlikte aslında web 3.0 ın programlanabilir web standartı yavaş yavaş yaygınlaşmya başladı. Web 3.0 yazılımcısı profilinde olabilecek değişikliklerden bahsetmiştim. Google'ın facebook a karşı oluşturduğu OpenSocial'da facebook tan daha rahat bir geliştirme ortamı sunacakları vaad ediliyor. FBML gibi ekstra kuralları öğrenmenin gerek olmayacağı gibi. Tabii ki diğer sosyal ağ ve benzeri platformların rekabet ortamı için bunu yapması kaçınılmaz gibi görünüyor.

Çok geriye gitmeden herhangi bir web tabanlı uygulamasında döviz bilgilerini göstermek için harcadığımız çabayı ele alalım. Bir bankadan bu bilgiyi almamız arada bir iş ortaklığı yoksa hala zor gibi görünüyor. Burada aslında kritik nokta verinin değerli olmasıydı. İçerik sağlayıcı bu içerik için bir maliyet harcıyor ve doğal olarak bunu ücretsiz vermiyordu. Web 2.0 ın içeriği kullanıcının yaratması özeliğiyle aslında maliyeti çok da fazla olmayan bir veri topluluğuna sahip olunabiliyor.

Bir facebook uygulamasından örnek verelim. Siz benim yazdığım bir facebook uygulamasını kullanmaya başlarsanız ben geliştirici olarak sizin ve arkadaşlarınızın profil bilgilerini alabiliyorum. Burada insanların facebook kullanırken açık olma özelliğini varsayarsak bu ayrıntı çok da önemli değil. Yani CRM kapsamında insanların çok büyük maliyetlerle elde ettiği profil bilgilerine ulaşmak mümkün oluyor. Bunu sadece sosyal ağ ile sınırlandırmazsak business anlamında çok daha fazla açılım yapması muhtemel görünüyor.

İdris Cin'in belirttiği şekilde sadece programlanabilir web uygulamaları için uygulama geliştiren yazılımcılar oluşmaya başlayacak. Diğer taraftan veriyi elde etme maliyetlerinin düştüğünü varsayarsak bu verilerin bilgiye dönüşme ve bunların gerçek uygulamalarda bir aksiyon olarak kullanılma konusu daha da önem kazanacak. Aslında şu aralar her şeyin daha hızlandığı ve belirsizliğin arttığı, stratejilerin anlık olarak değişebileceği bir döneme giriyoruz. Daha fazlasını bekleyip göreceğiz.

28 Ekim 2007

Assocıatıve (Çağrısımsal) Model Database

Web 3.0 'ın mimari anlamındaki yaklaşım değişikliğinden ve semantic web kavramının merkezine yerleşmesinden bahsetmiştim. Bir database mimarı veya tasarımcısının web 3.0 ile birlikte bir takım değişikliklere maruz kalması muhtemel. Veritabanı sistemlerinde köklü bir değişliklik olan ilişkisel veritabanı tasarımının yerini web 3.0 da associative (çağrışımsal) model tasarıma kısmen bırakabileceğini söyleyebiliriz.

Aslında ilişkisel veritabanı modelinin daha katı kuralları olan ve net veriler söyleyen bir model olduğunu söyleyebiliriz. Semantic web in doğası da aslında metadataya (veri hakkında veri) dayanmakta. Yani herşeyin siyah ve beyaz olmayıp gri tonların değerlendirilmesi; bir nevi bulantık mantık yaklaşımı.

Bir giriş niteliğinde fikir oluşması açısından Mike Griffiths 'in 2001 yılında yazdığı makaledeki örnekler üzerinde duracağım.




Verilerimiz aşağıdaki cümleler olsun.

"Red is a Colour"
"Mary is a Vegetarian"
"Vegetarians eat Plants"
"Cardiff is located in Wales"
"Wales is part of the UK"

Bu verileri ilişkisel bir veritabanında tutmak isteseydik çeşitli unsur tablolarına ve özelliklerinin tutulacağı ilişkisel tablolara ihtiyaç duyacaktık. Ama 5 cümlenin de birbirinden alakasız fiil ve özellikler içermesi sebebiyle ilişkisel model bir hayli zahmetli olacaktı.

Associative model kullanarak bu cümleleri saklamak istediğimizde 2 tabloya ihtiyacımız olacak. İlki nesne, fiil ve özelliklerin saklandığı Items tablosu, İkincisi ise bu item ların ilişkilerinin tutulduğu Links tablosu

Items

Items (1. tablo)

Identifier Name (Tablo alanları)
12 Red
41 Is a
76 Colour
14 Mary
81 Vegetarian
43 Eats
82 Plants
15 Ski Lessons
39 Start at
83 08:00
42 On
85 Sunday


Links (2. tablo)

Identifier Source Verb Target (Tablo alanları)
101 12 41 76
103 14 41 81
124 81 43 82
105 15 39 83
107 105 42 85

Burada göze çarpan en önemli nokta link tablosundaki bir elemanın farklı bir elaman içerinde bir kaynak olarak kullanılabilmesi. Verileri dikkatli bir şekilde incelediğinizde sanırım bu model hakkında bir miktar fikir sahibi olacaksınız.

Note:This picture has been taken from flickr.

01 Ekim 2007

Web 3.0 Yazılımcısı Olmak

Web uygulamalarının yaygınlaştığı yıllarda yazılım geliştiriciler arasında yazılım geliştirici ve web yazılımcısı şeklinde iki kategori oluştu. 2. grupta yer alan kişiler genelde çok detaylı kod bilgisi ve tecrübesi olmayan, asp ve php gibi script dilleri kullanabilen, bunun yanında html, javascript, flash bilen ve hatta tasarım yapabilen kişiler durumuna geldiler. Ülkemiz web yazılım piyasası düşünülürse aslında bu tarz ihtiyaçlar için deneyimli ve mektepli yazılımcılar yerine kendisini bu alanda geliştirmiş farklı yerlerden gelen web yazılımcıları maaş olarak daha cazip olduğu için bu pozisyonlarda çalıştırıldı. Bu süreçte web yazılımcısı kavramı ortaya çıktı.

Ben web 3.0 ile birlikte bu 2. grubun işlevselliğinin azalacağını düşünüyorum. Çünkü servis odaklı mimarilerde web sayfaları sistemin merkezi değil bir parçası konumuna geliyor. Bu modelde işleyen yapıların görünmeyen kısmının görünen kısmından daha etkili olacağı düşünülürse web sayfalarının kullanım oranının düşmesi beklenen bir sonuç olacaktır.

Ülkemizde hala yükselmekte ve yaygınlaşması sürmekte olan bir konu olduğu için bu trendlerin işleyisi zamansal olarak biraz farklılık gösterecektir.

Artık bir web yazılımcısından çok iyi bir database tasarımı, performanslı ve güvenilir servisler ile bunların çerçevesinde ciddi altyapılar beklenecektir. Bu beklenti de sanırım birinci gruptaki yazılım odaklı kişilerin yöneleceği bir boşluk olacaktır.







Son günlerin trend sitesi Facebook'u web 3.0 ve bu geçiş süreci için örnek kabul edebiliriz. Facebook bir web sitesi, ama aynı zamanda bir uygulama geliştirme platform altyapısı sunuyor. web 3.0'ın programlanabilir web tanımlaması da aslında bunu gerektiriyor.

Web 3.0'ın bir diğer odağı semantic web için de durum aynı şekilde. Artık database işlemleri kayıt ekle, sorgula sürecinden çok fazla uzaklaşıyor. Geliştiriciden ihtiyaca çözüm olacak algortimaları öğrenmesi ve kullanması beklenecektir. Üzerinde biraz daha kafa yorulması bir gereklilik olacaktır.

Aslında burada bahsettiğimiz konu büyük web uygulamalarının gideceği bir yol gibi görünse de zamanla her web uygulamasından servis beklentisi olacaktır. Örneğin başka platformlara servis vermeyen bir e-ticaret sitesinden bahsedemeyeceğiz. Kişisel web sitelerinde dahi rss benzeri hizmetlerin olması kaçınılmaz. Bu durumda da tüm bu servislere uygun derli toplu altyapılar olacaktır. Aslında web sitelerinin veritabanlarına ve bunun etrafındaki servislere dönüşeceğini söyleyebiliriz.

Bir çoğumuzun programcılığı öğrendiği lokal uygulamaların artık büyük ölçüde değerlerini yitirmesi gibi web uygulama geliştirmenin de zamanla değerini yitireceğini söyleyebiliriz.

İşin ilginç yanı bunları hala web uygulamalarının daha yeni yeni oturduğu ve büyüyen bir trend izlediği bir ülkeden söylememiz. Web 2.0 'ın "geldi, yaşandı, bitiyor" veryansınları arasında hala anlaşılamaması ve hala yeni bir yaklaşım gibi sunulup insanları heyecanlandırması gibi.

Note:This picture has been taken from flickr.

28 Eylül 2007

Newid Ve Newsequentialid Arasındaki Fark

NEWSEQUENTIALID SQL Server 2005 ile gelen yeni bir fonksiyondur.
Database'in GUID üretmesi için kullandığımız NewId ile, default değeri artan sayı olan durumların birleşimi olarak düşünebiliriz. Yani sıralı Guid üreten bir fonksiyon.
Bu fonksiyon sadece default değer olarak kullanılabilir. Kullanımı aşağıdaki şekildedir.

create table test(
colA uniqueidentifier DEFAULT NEWSEQUENTIALID(),
colB varchar(20)
)

insert into test (ColB) values ('aa')
insert into test (ColB) values ('bb')
insert into test (ColB) values ('cc')
insert into test (ColB) values ('dd')

eklemeleri sonucunda ColA varsayılan değer olarak aşağıdaki şekilde oluştu.

6EAF72CF-E96D-DC11-BD20-0011D8A6F316
6FAF72CF-E96D-DC11-BD20-0011D8A6F316
F0D309E7-E96D-DC11-BD20-0011D8A6F316
F817F4F1-E96D-DC11-BD20-0011D8A6F316

Fakat bu fonksiyon güvenlik gerektiren bir uygulamada kullanılamamalıdır. Çünkü değerler sıralı olduğu için kolayca tahmin edilebilir. Bu durumda NewId daha doğru bir tercih olacaktır.

24 Eylül 2007

And Operatörü ile Sorgulama

Veritabanı sorgulamalarında and ifadelerine sahip cümle grubunda 1. şartın sağlanmaması durumunda diğer şartlar kontrol edilmez. Bu durumda and ifadesi öğelerinde en hızlı çalışacak koşulu önce yazmak bize performans kazancı sağlayacaktır.

Örnek verecek olursak;

Bazı durumlarda bir değerin bulunan kayıta göre iki farklı alandan alındığı durumlar olabilmekte. Örneğin müşteri tablomuzda name,surname ve firmname isimli alanlar olsun.
Name ve surname alanları boşsa müşteri ismi firmname kolonundan alınsın.

Eğer biz A ile başlayan müşterileri sorgulamak istersek;

(name like 'A%' and firmname is null) or (firmname like 'A%' and name is null)

şeklinde yazabildiğimiz sorguyu ;

(firmname is null and name like 'A%' ) or (name is null and firmname like 'A%')

şeklinde yazarsak daha performanslı çalışır. Performans kazancı koşulların çok olduğu cümlelerde artacaktır.

19 Eylül 2007

Web 3.0 ve Servis Odaklı Mimari

Web 2.0. ın Ajax dışında kayda değer bir yazılım yeniliği getirmediğini, tasarım ve kullanıcı odaklı yeni yaklaşımlar olduğunu söyleyebiliriz. Web 3.0 da ise roller tamamen değişiyor. Web uygulama mimarisinin değiştiğini söylemek yanlış olmaz . Bir kaç yıldan beri sıkça duyduğumuz SOA (Servis odaklı mimari) kavramı Web 3.0 ın temeline yerleşiyor. Aslında Web 3.0 bir çok otorite tarafından bir web versiyonu olarak görülmüyor. Web sayfaları artık sistemin sadece bir arayüzü haline geliyor. Sistem tamamen servislerden oluşuyor. Amazon ve ebay canlı örneklerini verebiliriz. Şu anki yapıda, siz aynı altyapının sağladığı api veya web servisleri kullanarak kendi sitenizden satış yapabiliyorsunuz. Bunu mobil uygulamalara veya televizyondan satış gibi farklı ortamlara taşımak mümkün olacaktır. Bu süreç içerisinde amazon.com web sitesi de arayüzlerden biri haline geliyor. Yemeksepeti'nin Digiturk kanalından sipariş alma uygulamasını örnek verebiliriz. Uçuk örnek verecek olursak bir gıda perakendecisinin servislerini kullanarak buzdolabınızdan alışveriş yaptırması mümkün olabilir. Tabii ki kış aylarında pek tercih edilecek bir durum olmasa gerek :)

Burada bir parantez açmak gerekirse bunlar zaten hepimizin bir şekilde uyguladığı ve kullandığı yapılar. Web 2.0, Web 3.0 veya herhangi bir yaklaşımı sıfırdan oluşan şeyler olarak düşünmemek gerekiyor. Sadece benzer özelliklerin bir grupta toplanıp ortak standartların yakalanması olarak düşünebiliriz. Yoksa siz zaten web 2.0, web 3.0 veya herhangi bir standart özelliğini kullanıyor olabilirsiniz. Ayrıca uygulamanın sadece bir standart özellikleri de taşıması şart değil.

.net ve java web servisleri de aslında benzer bir ihtiyaç için çıkmıştı. Bir .net geliştiricisinin uygulamasının bir parçasını başka platformda uygulama geliştiren bir partiyle paylaşmasını sağlıyordu.


SOA kavramı ile beraber ikinci büyük yeniliğin semantic web olduğunu söyleyebiliriz. Semantic web, Hakia arama motoru ile bilinirlik kazanan mantıksal arama yaklaşımı. İçeriğin anlamını anlamaya odaklı bir yöntem. Klasik indeksleme ile bir web sayfası içerdiği kelimelere göre indekslenirken, bu yaklaşımda web dökümanının tümü düşünülerek bir indeksleme yapılmaktadır. Yani herhangi bir kelime, sadece gerçek anlamıyla değil bulunduğu konum itibariyle de anlamlandırılımaktadır. Semantic web için temel veri modeli olarak RDF (Resource Description Framework) kullanılabilir.

Bu arada .net versiyonlarının versiyon numarası ve özellik olarak web versiyonlarıyla beraber gitmesiyle Microsoft'un bu standartları kabul ettiği ve önem verdiği sonucunu çıkarabiliriz.

Başka bir açıdan bakarsak Web 2.0 aslında bir sosyal ağ patlaması yaratmıştı. Birbirine çok benzeyen ama kurgu olarak farklılık gösteren çok sayıda site geliştirildi. Web 3.0 'ın Web 2.0'ın içerik nimetlerinden faydalanıp veri analizi konusunda odaklanması muhtemel. Diğer taraftan SOA mimarisiyle daha çok iş ihtiyaçlarını karşılayacağını ve bu tarafta yeni açılımlar yaratacağını düşünüyorum.
Note:This picture has been taken from http://www.instamedia.org/ web site.

17 Eylül 2007

Oracle'da Triggerlar

Sql Server'da triggerlar sadece işlem yapıldıktan sonra çalışır.

Oracle'da BEFORE ve AFTER ek komutlarıyla triggerların tetikleme işleminden önce veya sonra olmasına karar verebiliriz.



Bu ek komutlar da iki durumda kullanılabilir.
İşlem bazında BEFORE ve AFTER ek komutları uygulanabilir.
Satır bazında BEFORE ve AFTER ek komutları uygulanabilir.

CREATE TRIGGER trigger_ismi
BEFORE DELETE OR INSERT OR UPDATE
ON tablo_ismi
{pl/sql kod bloğu}

15 Eylül 2007

Microsoft Terminolojisi

Microsoft'un işletim sistemleri ve özel uygulamalarında kullandığı stringlerin 28 dildeki karşılıklarını buradan indirebilirsiniz.

Bir kısmı sadece Microsoft'a özel kelime grupları olmakla beraber büyük bir kısmı uluslararası yazılım geliştiren firmalar için faydalı olacaktır. Aslında her yazılım üreten firma için en azından bir kaç dilde bir terminoloji hazırlamak uygulama kalitesini arttıracaktır. Özellikle sektör spesifik yazılım üreten firmalar için bu çok daha önemli.

14 Eylül 2007

Tafiti Arama Motoru


Microsoft Tafiti adıyla Silverlight teknolojisinin kullanımını göstermek amacıyla live search ile entegre çalışan bir arama motoru geliştirdi. Microsoft klasik bilinirlik arttırma yaklaşımıyla görsel öğeleri ön plana çıkarmış. Ayrıca sonuçların ağaç yapısı ile gelmesi ilginç bir özellik olmuş. Silverlight ile uygulama geliştirmenin .net geliştiricileri için bir avantaj olduğundan daha önce bahsemiştim. Bunlar iyi tarafları.

Fakat kullanıcı olarak bu arama motorununun Google'a alternatif olabileceğini zannetmiyorum.

Nedenleri;
* Arama motoru için görsellik ne kadar önemlidir?
* Live Search arama motoru ve Google ile arasında ciddi performans farkları var.
* 1 sn nin altı sonuçlar getiren bir uygulama için ilk sayfa açılışının bir kaç sn sürmesi ne kadar uygun.

Son olarak da eğer Google böyle bir siteyle çıksaydı acaba bu kadar yaygın kullanılabilir miydi?

Ben Microsoft'un bu girişiminin sadece Silverlight bilinirliğini arttırmaya yönelik olduğu kanısındayım.

28 Ağustos 2007

Bir Servis Olarak Business Intelligence

DM Review Magazine'in Ağustos sayısında yayınlanan bir makalede On-Demand Business Intelligence kavramından bahsedilmiş. Değinilen en önemli konu Business Intelligence uygulamalarının SaaS (Software as a Service) mimarisinde çalışması.

Günümüz BI uygulamalarına baktığımızda çoğunlukla canlı olmayan ve işlenmiş verilerden raporlama yapılıyor. Gerçek zamanlı BI mimarisindeki hedef verilerin canlı olarak gelmesi.
Aşağıdaki şekilde şu anki BI uygulamaları ile SaaS mimarisindeki uygulamaların farkları belirtilmiş.


Aslında klasik BI çözümlerine bir alternatif olarak sunulması pek de olanaklı değil. Belki uygulamalarının bir kısmının SaaS olarak sunulması düşünülebilir.

Tasarım ve uygulama aşamasının ay mertebesinden günler mertebesine inmesi sektör ve kurum bazlı özel analiz süreci dolayısıyla yine sıkıntı yaratacaktır.

Kurulum takımının son kullanıcı olarak oluşması yine son kullanıcıların gelişimiyle alakalı. Şu anki Türkiye şartlarında bunu son kullanıcıdan beklemek pek de olabilir gelmiyor.

Özet olarak şahsi görüşüm SaaS mimarisindeki BI çözümlerden önce raporlanan datanın tam zamanlıya çok yaklaşması aşaması doğru bir geçiş olacaktır.

Gelişmeleri bekleyip göreceğiz.

25 Ağustos 2007

Veritabanı Tarafında Sayfalama (Paging)

Raporlama modüllerinde eğer sayfalamayı grid tarzı bir kontrole bırakmıyorsak aşağıdaki sorguları kullanarak verdiğimiz aralıktaki kayıtları çekebiliriz.Oracle'da daha önce var olan yapı Sql Server 2005 birlikte Sql server kullanıcıları için de eklendi.

Oracle için;

select * from (
select rownum rnum from (
select * from table
) t1
) where rnum between 101 and 200


Sql Server 2005 için (AdwentureWorks veritabanını kullandık)

select AddressLine1,City, ModifiedDate
from (select AddressLine1,City,ModifiedDate,row_number() over (order by
ModifiedDate desc)
as rnum from Person.Address) as RnumAdress
where rnum >= 101 and rnum <= 200

Fakat bu yapıların tek dezavantajı raporlama anında kayıt değişiklikleridir.
Örnek verecek olursak;
Sitede bir panelde online 100 kişi 10'arlı sayfalar halinde siteye giriş sırasına göre gösteriliyor. Eğer bu gezinme esnasında siteye yeni kişiler girerse bu kayıtlarda kaymalar olacaktır. Sayfalarda ilerlemeye devam ettikçe bir önceki sayfanın sonundaki kayıtların bir sonraki sayfanın ilk kayıtları olarak eklendiğini görürüz. Genellikle bu çok da zararlı olmayan durum performansı etkileyecek diğer yöntemlere tercih edilmektedir.

21 Ağustos 2007

Saas (Software as a Servıce)

Büyük iki S harfi arasına sıkıştırılmış 2 küçük a dan oluşan simetrik kısaltma; Software as a Service. Aslında direk yeni olmayan bazı yazılım davranışlarının bir jargon altında toplanması olarak tanımlayabiliriz. Müşterinin donanım ve yazılım ücreti ödemeden sadece üyelik ve düzenli servis ücretiyle hizmet aldığı bir model. SaaS modelinin yaygın kullanım alanları daha çok CRM,ERP, İnsan Kaynakları, B2B, B2C, İçerik Yönetim Sistemleri.

SaaS mimarideki CRM hizmeti konusunda pazar lideri durumunda Salesforce firmasının demosu size gerçek uygulamalar için bir fikir verecektir.

Gartner verilerine göre 2006 yılında 6.3 milyar $ olan SaaS pazarının 2011 yılında 19.3 milyar $'a çıkacağı varsayılıyor.

Microsoft'un bu mimari ile ilgili olarak .net 3.0 ve Sql Server 2005 teknolojilerinde geliştirdiği LitwareHR isimli bir örnek İnsan Kaynakları uygulaması mevcut.

Müşteri açısından değerlendirildiğinde SaaS mimarisinin klasik yazılım uygulamalarına bir kaç avantajını aşağıdaki şekilde sıralayabiliriz;

  • Kurulum süresi
  • Kurulum maliyeti
  • Genel bir uygulama olması nedeniyle kendilerini etkileyecek bir problemin muhtemelen genel bir problem olması.
  • Lokal uygulamalardaki teknik destek için müşteri ofisindeki destek gereksiniminin kalmaması.
  • Versiyon değişikliklerinin müşteriden bağımsız gerçekleşmesi

Daha önce büyük ölçüde SaaS mimarisinde değerlendirebileceğimiz email marketing ve mobil marketing uygulamalarının analiz ve yazılım geliştirme aşamalarında bulunmuştum. Yazılım üreten ve sağlayıcı konumundaki firmamız açısından yaşanan en büyük sorunun müşterinin kendi verilerini sağlayıcı server ında tutmak istememesiydi. Data güvenliği ve datanın sağlayıcı tarafındaki teknik kişiler tarafından bile görülemeyeceği bir model mutlaka sağlanmak durumunda. Bu nedenle özellikle CRM ve bu çerçevedeki Müşteri Veritabanı Yönetim projelerinin SaaS mimarisinde uygulanması bir miktar daha zorlaşmakta.

Daha detaylı bilgi için SaaS'in farklı açılardan ele alındığı SaaSblog u incelemenizi tavsiye ederim.

Note : This picture has been taken from http://www.tistory.com/ web site.

17 Ağustos 2007

Tabloda Tekrar Eden Kayıtların Tekilleştirilmesi

Tablomuzda tekrar eden kayıtları tek bir sorguyla tekilleştirebiliriz.



delete [user]
where userid not in
(select max(userid) from [user]
group by username,usersurname)


Eğer userid alanımız kayıt bazında tekil değilse



Bu durumda testid isimli bir identity alan eklememiz gerekir.
Sorgu ise aşağıdaki şekilde değişir;
delete [user]
where testid not in
(select max(testid) from [user]
group by userid,username,usersurname)


16 Ağustos 2007

Where Kosulunu Devre Dışı Bırakmak

Blog yazılarımda karşılaşıp bulduğum bazı küçük çözümleri yazmaya çalışıyorum. Ne yazık ki klasik problemlerle ilgili bir çok sonuç bulabilirken çok özel durumlar için bilgi bulmak biraz zor oluyor.

Bir listeleme kontrolünüz olsun. (Treeview, Combo, Listbox ..).
Bu kontrolün elemanları bir sorguyla dolsun ve seçilen elemanın değerini başka bir listelemede kullanalım.

Örneğin ismin ilk harfine göre listeleme olsun ve hangi harf seçilirse diğer listede bu harfle ilgili bir içerik gelsin.

İlk listeyi aşağıdaki sorguyla dolduralım.

select 'A','A'
union select 'B','B'
union select 'C','C'

Diğer listelemede de

Select * from User where username like '@content%'

Buraya kadar herşey normal görünüyor. Fakat bir de bunların en üstünde 'Tüm Kullanıcılar' şeklinde bir durum istenirse nasıl olacak?

Burada sıkıntı olacak 2 durum sözkonusu. Birincisi bu seçeneğin en üstte çıkma gerekliliği, ikincisi ise diğer listeleme sorgusunu kullanarak where koşulunu es geçmek. Eğer like yerine = koşulu olsaydı klasik injection yöntemiyle 'aaa or 1=1' değeriyle çözüme ulaşabilirdik.

Bu durumu ise bir kaç deneme sonucu content değeri için '%' vererek çözebildim. Hem listede en üstte çıktı hemde where koşulunda sınırlama koymadı. Yani (where kolon like '%%') şeklinde where koşulunu işlem dışı yapabiliyoruz.

Belki bir yerlerde işinize yarayabilir.

15 Ağustos 2007

Yeni Nesil Google

Google'ın şaşılacak kadar kısa sürede sonuç getirmesinin verdiği hayranlığın artık aşıldığını düşünüyorum. Bir taraftan da kütüphanede bilgi aramak ile kıyaslandığındaki muhteşem hız yerini "acaba doğru mu?" kuşkularının artmasına bıraktı. Bir çok kişinin ortak sıkıntısı ise artık Google'da aradığını bulamamak. Veritabanı ve Pazarlama yazısında kısaca bahsettiğim şekliyle bilinçsiz veri toplama sonucunda artık bir çok kişinin elinde az kullanılmış veri çöplükleri var. Bir süre sonra acaba google da bir çöplük olacak mı? Aradığını bulamama problemi ile birlikte içeriğin bu hızla artmasıyla içerik kalitesinde de belli oranda düşüş yaşanacağı kesin.

Aradığını bulamamak problemi için en büyük neden olarak eşsesli kelimelerin kargaşasını örnek verebiliriz. Temel bir çözüm olarak kullancı deneyimlerini baz alarak yapılan indekslemeler bu problemi biraz azaltacaktır. Her aramada binlerce sonuç yerine bana özel sonuç kümesi gelmeli. Örneğin ben daha çok yazılımla alakalı kelimeler arıyorsam "structure" kelimesi yazdığımda muhtemelen inşaat görmek istemiyorumdur. Diğer taraftan bu özellik de benim gerçekten inşaatla alakalı bilgi aradığım durumlarda problem yaratacaktır.

Olaya farklı bir açıdan bakalım. Bir çok kişinin iş görüşmesi öncesi adayın ismini google da aradığını biliyoruz. Arayan kişinin aday hakkında çıkan sonuçları aslında kendi deneyimleri sonucu geleceği için o kişiye ne kadar yakın veya uzak olduğu hakkında da bir fikir verebilir. Aynı şekilde iki kişinin birbiriyle yakınlığı hakkında da bir fikir verebilir. Diğer taraftan çalışan da iş görüşmesi yapacağı genel müdürün ismini googleda aratıp, onun bir röportajını okuyup, bu bilgileri iş görüşmesinde kullansa sanırım doğru bir iş yapmış olur.

Daha da ileri gidersek medeni kanuna google aramalarında belli oranda uyumluluk şartı getirilebilir:) Birbirinizi çok seviyorsunuzdur ama aranızda ne yazık ki google vardır. Google hayatımıza daha fazla girmeye devam edecek mi acaba?

14 Ağustos 2007

Birleşmiş Milletler ve Sql Injection

Hackademix'te geçen habere göre Birleşmiş milletler sitesi SQL Injection yoluyla hacklenmiş. Yanlış hatırlamıyorsam 2003 yılında bir SQL Injection seminerinin akşamında ülkemizde 500 kadar site hacklenmişti. Uzun süredir gündemde ve de korunulması basit olmasına rağmen hala injection ihmali devam ediyor.
Note : This picture has been taken from http://www.bobnewell.net/ web site.

13 Ağustos 2007

Tablo ve Kolon Listesi

Çok tablolu sistemlerde tablo ve kolon adlarını hatırlamak çoğu zaman zor olmaktadır. Oracle ve SQL Server'da aşağıdaki sorgularla bu bilgilere ulaşabiliriz.

Oracle:

Tablo listesi
select * from tab
select * from tabs
Kolon listesi
select * from col
select * from cols

SQL Server

Tablo listesi
select * from sysobjects where xtype='U',
select * from INFORMATION_SCHEMA.TABLES
Kolon listesi
select * from syscolumns
select * from INFORMATION_SCHEMA.COLUMNS

31 Temmuz 2007

Union All Kayıt Setinden Gruplamak

Union All ile oluşan kayıt setini bir tablo olarak düşünüp bunun üzerinde gruplama işlemi yapabiliriz. Çeşitli zorunluluklardan veya kötü tasarımdan dolayı raporlama esnasında çeşitli yöntemler bulmak zorunda kalabiliriz.
Örneğin bir satış sitesi olsun ve aynı ürüne ait satış bilgileri farklı 3 tabloda tutulsun. Biz bu 3 tablodan ürün koduyla sorgulama yapıp toplamlarını çekelim. Son olarak da hepsinin toplamını almamız istensin.

select UrunKod,Sum(Fiyat) from
(
select UrunCode,Sum (UrunFiyat) as Fiyat
from table1
where UrunCode=x

union all
Select UrunCode,Sum(UrunFiyat) as Fiyat
From table2
Where UrunCode=x

union all
Select UrunCode,Sum(UrunFiyat) as Fiyat
From table3
Where UrunCode=x
)
group by UrunKod

Bu şekilde tek sorguyla istediğimiz sonucu elde edebiliriz. Hem kod içerisinde ekstra koda ihtiyacımız kalmaz hem de bir miktar performans sağlamış oluruz.

25 Temmuz 2007

Haftanın Gününü Veren Fonksiyon

Sql Server'da verilen tarihin haftanın hangi günü olduğunu döndüren kullanıcı tanımlı bir fonksiyon yazalım. DATEPART(weekday,date) şeklinde dönen değer haftanın gün sırasıdır. Fakat bu değer haftanın ilk günü olarak tanımlanan DATEFIRST server değişkenine göre değişmektedir. Bu yüzden fonksiyonda bu durum için bir önlem alacağız.
Amerikan ingilizcesi dil ayarlarında default değer 7 yani Pazar'dır.

SELECT @@DATEFIRST ile tanımlı değeri alabiliriz
SET DATEFIRST 1 (İlk günü Pazartesi olarak tanımlayabiliriz)

CREATE FUNCTION DayOfWeek(@date DATETIME)
RETURNS VARCHAR(9)
AS
BEGIN
DECLARE @defDayofWeek VARCHAR(10)
DECLARE @dofWeek int
SET @dofWeek= (@@DATEFIRST + DATEPART(weekday,@Date)-1)%7
SELECT @defDayofWeek=CASE @dofWeek
WHEN 0 THEN 'Pazar'
WHEN 1 THEN 'Pazartesi'
WHEN 2 THEN 'Salı'
WHEN 3 THEN 'Çarşamba'
WHEN 4 THEN 'Perşembe'
WHEN 5 THEN 'Cuma'
WHEN 6 THEN 'Cumartesi'
END
RETURN (@defDayofWeek)
END


SET @dofWeek= (@@DATEFIRST + DATEPART(weekday,@Date)-1)%7
ifadesinde ilk günün her zaman Pazartesi olmasını sağladık.

24 Temmuz 2007

Union All Kullanarak Toplu Insert

UNION komutu kullanarak aynı tipteki değerleri tek transactionda ekleyebiliriz. Örneğin bir kayıt formumuz olsun ve bu formda kişinin okuduğu gazeteleri checkbox tipinde bir kontrolle alalım. Normalizasyonu düşünerek bu değerleri farklı bir tabloda UserId ve GazeteId olarak tutalım. Standart yöntemle bir döngü içerisinde her seçili olan kayıt için bir insert komutu çalıştırılır. Fakat bu döngü içinde seçili olanları UNION ALL ile birleştirip tek sorguda kaydı yapabiliriz.

Sorgumuz aşağıdaki şekilde oluşur;



Kayıt sayısının çok fazla olduğu durumlarda işlem süresindeki kazancımız ciddi oranda artacaktır.

21 Temmuz 2007

Silverlight Flash'a Karşı

Oyun bağımlılığım hiç olmadı. En son ortaokul yıllarında tetris rüzgarından nasibimi almıştım. Silverlight örneklerine bakarken bu eski dost bir hayli hoş geldi bana.

Tetris örneğini oynamak için öncelikle Silverlight 1.1 Alpha eklentisini kurmanız gerekecektir.

Microsoft'un zengin interaktif uygulamalar için tarayıcı eklentisi olarak Adobe Flash'a alternatif olarak çıkardığı Silverlight üzerinde bir çok örnek uygulama yapılmaya başlandı. Şu an % 98 oranında yaygınlığa sahip flash a rakip olması ilk bakışta biraz zor görünüyor. Fakat Microsoft'un uyguladığı çapraz ürün bağımlılığı stratejisi onun en büyük avantajı. Örneğin bir .net uygulama geliştiricisi hakim olduğu platformda interaktif uygulama geliştirmeyi flash öğrenmeye/kullanmaya tercih edecektir.

Uygulamanın kaynak kodlarına buradan ulaşabilirsiniz

Bekleyelim ve görelim.

19 Temmuz 2007

Sql Server'dan Oracle'a Geçiş

Yazılım projelerinde veritabanı olarak Oracle ve Sql Server hatırı sayılır bir büyüklüğe sahiptir. Bu nedenle bir çoğumuz iki veritabanıyla da uğraşmak durumunda kalabiliriz. Sql Server'da iyi derecede olup Oracle'a geçişi kolaylaştırmak için başlangıç düzeyindeki farkları yazmanın faydalı olacağını düşündüm. Verdiğim tüm örneklerde Sql Server ifadelerini büyük harflerle Oracle ifadelerini küçük harflerle yazacağım.

Öncelikle çok kullanılan bir kaç fonksiyona bakalım;
GETDATE() - sysdate
ISNULL - nvl
CONVERT(VARCHAR,x) - to_char(x)
CONVERT(DATETIME,x) - to_date(x)
LEN - length
+ -

SELECT * INTO NEW_TABLE FROM TABLE şeklindeki SELECT INTO kalıbı yerine Oracle'da create table new_table as select * from table ifadesini kullanabiliriz.

İki tarih arasındaki fark için kullandığımız DATE_DIFF in direk karşılığı Oracle'da yok. date_diff_month(date1,date2) fonksiyonuyla ay farkını alabiliriz. Ayrıca date2-date1 ifadesi direk olarak gün cinsinden sonuç vereceği için gün farkı için bunu kullanabiliriz.

Değişken tanımlamada
DECLARE @a
INTEGER SET
@a=3
şeklindeki ifade Oracle'da
declare a number;begin a := 3;end;

Sql Server'da bir objeden bağımsız olarak SELECT 1 şeklinde bir sorgulama yapabiliriz. Oracle'da ise dummy table olarak adlandırılan DUAL tablosundan sorgulama yapmamız gerekecektir.
select 1 from dual

17 Temmuz 2007

Kurumsal Veri Yönetimi

İşletmelerin hemen hemen hepsinde kritik öneme sahip Kurumsal Veri Yönetimi konusuyla ilgili kritik sayılabilecek maddeleri aşağıdaki şekilde sıralayabiliriz;



Data Yönetiminin Planlanması

  • Data gizliliğinin sağlanması
  • Data giriş işlemlerinde doğrulama yapılması
  • Data arşivlemesinin düzenli olarak yapılması
  • Bilgi güvenliğinin sağlanması

IT altyapısının basitleştirilmesi

  • Sürekli data büyümesinin kontrolü ve yönetiminin yapılması.
  • Sürekli depolama stratejilerinin belirlenmesi
  • Uygulama içerisinde data temizliği ve tekilleştirme işlemlerinin yapılması
  • Uygulamanın optimize edilmesi

İş Devamlılığının Sağlanması

  • Yükseltim ve aktarımlarda riskin minimuma indirilmesi
  • Hızlı yedekleme ve hızlı geri dönüş
  • Uygulama ulaşılabilirliğinin arttırılması

Kurumsal Değerlere Odaklanmak

  • Uygulamanın iş ihtiyaçlarına göre verimliliğinin arttırılması
  • İş zekası ve içerik Yönetimi nin entegre edilmesi
  • Doğru data yönetim çözümlerinin kullanılması
  • Performans optimizasyonu yapılması ve maliyetlerin kontrol edilmesi

11 Temmuz 2007

Veritabanı ve Pazarlama

Amazon ve eBay etkin veritabanı kullanarak nasıl birer deve dönüşmüştür? Aslında Amazon basit anlamda müşterilerinin satış bilgilerini kullanarak yeni satışlar için çeşitli yönelimler sunmuştur. Peki CRM yaklaşımında kullanılan müşteri veritabanı nasıl oluşur?
Ana sınıflandırma olarak hayatın doğal akışıyla oluşan veriler ve özel olarak alınan veriler olarak iki tip veriden bahsedebiliriz. Örneğin Turkcell için benim yaptığım tüm aramaların numaraları, konuşma süreleri,tercih ettiğim saatler, mesaj çekme yoğunluğum, hangi şebekeleri kullandığım doğal akışımda oluşan bilgilerdir. Hat almak için doldurduğum sözleşmedeki bilgilerse 2. kategoridedir. Aynı şekilde marketten aldığım ürünler de doğal akışla oluşan veriler. Başka bir gruplamayı da kişilerin özlük bilgileri, tercihleri ve aktiviteleri olarak tanımlayabiliriz. Bu gruplamada bazı durumlarda aktivite tercihler hakkında bilgi sahibi verebilir.
Veritabanı kullanım şeklini de 3 seviyede ele alabiliriz. Birincisi klasik anlamda bazı işlemleri yapabilmek için veri depolamak anlamında kullanılan veritabanı. Örneğin giriş yapan kullanıcının şifre kontrolü için şifre bilgisini kaydetmek.İkincisi raporlama ve analiz amaçlı bazı verileri depolamak.Üçüncüsü ve en önemlisi ise bu verilerin işlenerek stratejik kararlarda destek niteliğinde kullanılması.
Bu durumlar için en güzel örnek Google Analytics aracı olacaktır. Bir kaç yıl öncesine kadar sitelere konulan sayaçlar belki de sitenin istatistik ihtiyacını gideriyordu, fakat günümüzde tarih, saat, lokasyon, sitede kalma süresi, internete bağlandığı ağ, tarayıcı tipi, javascript desteğinin olup olmadığı, arama motorlarından geldiyse hangi kelimelerle arandığı gibi çok sayıda veri alınıyor.
Peki bu yöntemle elimizde çok değerli! bilgiler oluştu. Bu bilgileri saklayabilmek için veri depolama maliyetlerimiz arttı. Veri çoğaldığı için yorumlamak daha da zorlaştı. Kritik olan nokta bu verilerin ne kadarını kullandık. Attığımız taş ürküttüğümüz kurbağaya değdi mi?

Bir kaç önemli kuralı sıralayacak olursak;
* Esnek bir veritabanı tasarımı yapılıp bu tasarıma göre veri alınmalıdır.
* Her veri önemli değildir. Bilgiye dönüşmeyen verinin bir faydası yoktur.
* Veri alındığı anda değerlidir. Bir süre sonra veri önemini kaybeder.
* İnsanlar bilgi vermekten hoşlanmıyor veya isteksiz veriyor.

Çehov'un "Duvarda asili silah oyunun sonunda mutlaka patlar" kuralına gönderme yaparak "veri alındıysa mutlaka değerlendirilmelidir" dersek çok katı olmayız sanırım :)

04 Temmuz 2007

Oracle'da Kill Process İşlemi

Veritabanlarının doğal süreçleri olarak kabul edilen deadlock lar Oracle üzerinde oluştuğunda aşağıdaki nacizane hatayı alırız.

ORA-00054 resource busy and acquire with NO WAIT specified

Bu durumda hata oluşan prosesi kill etmek yoluyla kaynağı boşaltabiliriz.Öncelikle aşağıdaki sorguyla lock oluşan işlemleri listeleyelim.

SELECT o.object_id,s.sid,s.serial#,o.object_type,o.object_name,
l.oracle_username,os_user_name,locked_mode,s.program
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id = o.object_id AND l.session_id=s.sid

Daha sonra da istediğimiz sessionları aşağıdaki sorguyla bitirebiliriz.

ALTER SYSTEM KILL SESSION 'sid,serial'

30 Mayıs 2007

Son Çalışan Sorguların Listesi

Daha önce Profiler aracını kullanarak izleyebildiğimiz çalışan sorgu listesine Sql Server 2005'le birlikte sys.dm_exec_query_stats isimli view sayesinde ulaşabiliriz. Bu özelliğin bazı projelerde işleri kolaylaştıracağını düşünüyorum. İhtiyaç halinde kullanmak üzere view i kullanan basit bir sp yazalım.
Sorgunun metnini, son çalışma zamanını,sorgu çalıştırma planını ve sorgunun çalışma sayısı bilgilerini döndürsün.

CREATE PROCEDURE [dbo].[sp_qryStats]

as
SELECT

SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset
END
- qs.statement_start_offset)/2) + 1) as statement_text,
convert(varchar,last_execution_time) as last_execution_time,
qp.query_plan,
execution_count
FROM sys.dm_exec_query_stats as qs
--sql_handle değeri text hale getirilir
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as st
--plan_handle değeri xml tipte veri döndürecek hale getirilir
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as qp
--Aslında bu çalıştıracağımız sorgu da listelenen sorgular arasında olduğu için bir where koşulu ekledik
Where st.text not like '%sys.dm_exec_query_stats%'
ORDER BY last_execution_time DESC

exec [dbo].[sp_qryStats]
Prosedür sonucunda alacağımız çıktı aşağıdaki şekilde olacaktır.


29 Mayıs 2007

SSIS Kullanarak Veri Tekilleştirmesi

Sql Server 2005 ile gelen Business Intelligence araçlarından Integration Services projesi hazırlayarak çok basit bir uygulama yapacağız. Özet olarak 6 satırlık bir tabloda verdiğimiz kurallara göre tekilleştirme yapıp tekil ve tekil olmayan kayıtları farklı tablolara ekleyeceğiz.

--Örnek tablomuzu yaratalım,
CREATE TABLE [dbo].[user](
[userid] [int] IDENTITY(1,1) NOT NULL,
[ad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[soyad] [varchar](50) COLLATE Turkish_CI_AS NULL,
[email] [varchar](100) COLLATE Turkish_CI_AS NULL,
[gsm] [varchar](20) COLLATE Turkish_CI_AS NULL,
[insertDate] [smalldatetime] NOT NULL CONSTRAINT [DF_user_insertDate] DEFAULT (getdate())
) ON [PRIMARY]

--Test kayıtlarımızı ekleyelim,
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Zinedine','Zidane','zinedine@zinedine.com','5321234567')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Samuel','Eto','samuel@eto.com','5329876543')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Erik','Cantona','eric@cantona.com','5321111111')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('ZINEDIN','ZIDAN','zinedine@zidan.com','')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Samuel','Etho','samuel.eto@eto.com','')
INSERT INTO [dbo].[user](ad,soyad,email,gsm)
Values('Eric','Cantona','eric@cantona.com','5321111111')

Visual Studio 2005 kullanarak Business Intelligence Projects tipi projelerden bir Integration Services Project yaratalım. Data Flow sekmesindeki linke tıklayarak yeni bir Data Flow yaratalım. Data Flow Sources panelinden bir tane OLE DB Source kontrolü ekleyelim. Gerekli bağlantı ayarlarını yapıp, "Table or View" seçeneğini aktif bırakıp "user" tablomuzu seçelim. Bu şekilde kaynak datamız hazırlanmış oldu. Data Flow Transformations panelinden Fuzzy Grouping kontrolünü Data Flow'a ekleyelim. Bu kontrolü kaynak kontolden çıkan yeşil okla birleştirelim. Fuzzy Grouping kontrolünün Columns sekmesine tıklayarak, tekilleştirme yapmak istediğimiz kritik alanları ve benzeşim katsayılarını seçmemiz gerekecektir.Örnek olarak ad ve soyad alanlarının solundaki chkbox ları seçip, Minimum Similarity değerlerini 0,7 yapalım. Bunun anlamı ad ve soyad değerleri %70 oranında benzeyen satırlar aynı kabul edilecektir. Data Flow Transformations panelinden Conditional Split kontrolünü önceki kontrolün yeşil okuna ekleyelim. Bu kontrolde kritik olan _key_in ve _key_out kolonlarıdır.
_key_in : Satırın tablodaki sıra değeridir.
_key_out: Satırın verdiğimiz kriterlere göre benzeşim sıra değeridir
.
Burada 2 durum sözkonusu olsun. Tekil ve diğer kayıtları ayırmak isteyelim.
Case 1 : _key_in == _key_out
Case 2 : _key_in != _key_out
şeklinde 2 durum yaratalım.

Son olarak bu iki durumdan çıkan kayıtları farklı tablolara atmamız gerekecek.Bunun için de Data Flow Destinations panelinden 2 tane OLE DB Destination kontrolü ekleyelim. Bir önceki kontrolün yeşil okunu hedef kontrole bağlamaya çalıştığımızda bize hangi durumun çıktısını alacağımızı sorar. Projeyi çalıştırdığımızda örnek 6 kaydın 3 er kayıt olarak 2 tabloya eklendiğini görebilirsiniz. Veri kolonlarına ek olarak benzerlik oranlarının da ek kolonlar olarak eklendiğini göreceksiniz.

Sonuçta aşağıdaki şekilde bir Sql Server Integration Service paketimiz oluşacaktır,


Yazıyı fazla uzatmamak için detaylara çok fazla inmedim. Bu projeyi aşağıdaki linkten indirirek detayları inceleyebilirsiniz.

http://www.harunpeksen.net/CodeSample/SSISTest1.rar

Not: Projeyi kendi sisteminizde çalıştırmak için Sql Server bağlantı değerlerini güncellemeniz gerekecektir.

08 Nisan 2007

Sql Server'da Case Fonksiyonu

SQL SERVER'da CASE fonksiyonuna bir örnek verelim. Web sitemİzdeki üyeler siteye giriş yaptıktan sonra bir karşılama mesajımız olsun ve bu mesaj da üyenin Cinsiyet,Yaş ve Medeni Durum bilgilerine göre oluşsun.

25 yaşından büyük veya evli bayanları; Hoşgeldiniz Ebru Hanım,
25 yaşından büyük veya evli erkekleri; Hoşgeldiniz Emre Bey,
18-25 yaş arası ve evli olmayan kişileri; Merhaba Ahmet/Ayşe,
18 yaşından küçükleri de; Sevgili Ebru/Emre,

olarak karşılamak isteyelim.

Önce üye tablomuzu yaratalım

CREATE TABLE [dbo].[Uye](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[Ad] [varchar](50) NOT NULL,
[Soyad] [varchar](50) NOT NULL,
[Yas] [smallint] NOT NULL,
[Cinsiyet] [char](1) NOT NULL,
[MedeniHal] [char](1) NOT NULL,
CONSTRAINT [PK_Uye] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)
)

Sonra örnek kayıtlarımız girelim

INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Ebru','Kaya',29,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Emre','Aslan',29,'E','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Aslı','Doğan',23,'K','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Selim','Kutlu',17,'E','B')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Sibel','Ayaz',24,'K','E')
INSERT INTO Uye(Ad,Soyad,Yas,Cinsiyet,MedeniHal)
VALUES ('Nilay','Kalaycı',14,'K','B')



Daha sonra sql cümlemizi aşağıdaki şekilde oluşturalım.

SELECT [UserId],[Message] = CASE
WHEN Cinsiyet='K' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Hanım'
WHEN Cinsiyet='E' AND (Yas>25 OR MedeniHal='E') THEN 'Hoşgeldiniz ' + [Ad]+ ' Bey'
WHEN Yas>18 THEN 'Merhaba ' + [Ad]
ELSE 'Sevgili ' + [Ad]
END
FROM Uye

Sorgu sonucumuz aşağıdaki şekilde olacaktır.



17 Mart 2007

Normalizasyon

Veritabanı tasarımı konusunda en önemli kavramlardan biri olan Normalizasyon ile ilgili teorik çok fazla şey yazılabilir. Ben bu kavramı kafasında net olarak oturtamayanlar için küçük bir örnek vermek istedim. Tasarlayacağımız veritabanı çok uluslu kaynaklarla proje üreten bir firmanın yaptığı proje ve çalışan bilgilerini tutsun. Projelerimizi "Amerika'nın yeniden keşfi" ve "Lambaya püf denilmesi" olarak belirleyelim.

Proje bilgileri tablomuzu oluşturup gerekli kayıtları ekleyelim.



Normalize etmek için öncelikle tekrarlanan sütunları bulalım. Bu datayı normalize ettiğimiz zaman 5 tablomuz olacaktır. Bunlar.

Proje (ProjeId,ProjeAd)
Calisan(CalisanId,CalisanAd,CalisanMaliyet,CalisanUlke)
Maliyet(MaliyetId,MaliyetTutar)
Ulke(UlkeId,UlkeAd)
ProjeBilgileriN(ProjeId,CalisanId,CalismaGunu)



Normalize ettiğimiz tablolara aynı verileri girelim.



Bu tasarımda önemli bir kaç normalizasyon kuralını kullandık. Aşağıdaki linkte 5 normalizasyon kuralı bir afiş olarak yer alıyor. İlginç.
http://www.marcrettig.com/poster/rettigNormalizationPoster.pdf

07 Mart 2007

Sql Server Best Practices Analyzer Aracı

Bir kaç gün önce Microsoft Sql Server Best Practices Analyzer adlı bir araca rastladım. İstediğiniz Sql Server instance ı üzerinde seçtiğiniz database leri analiz edip size çeşitli önerilerde bulunuyor. Ben örnek olarak Service Pack 3 yüklü 2000 instance ı üzerindeki Northwind database ini analiz ettim. Aşağıdaki şekilde bir rapor oluştu.



Daha açık olarak;

* SQLBrowser servisinin LocalSystem accountu altında çalıştığını ve bunu önermediklerini belirtmiş
* Bulk Insert işleminde bazı problemler yaşanabilir, 8.00.2187 (Service Pack 4) yüklemeyi önermiş
* Automatic checkpoint özelliğini kullanabilmek için 8.00.2187 (Service Pack 4) yüklemeyi önermiş
* Şu an Mixed modda çalıştığımı, güvenlik sebebiyle "Windows Authentication" modda kullanmayı önermiş
* Çok sayıda kullanıcının SysAdmin rolünde bulunduğunu, 2'den fazla olmaması gerektiğini belirtmmiş
* Service Pack 4 'e geçmeyi ayrıca önermiş
* SQLAgent servisinin LocalSystem accountu altında çalıştığını ve bunu önermediklerini belirtmiş
* Memory Scribbler probleminin Service Pack 4 öncesinde yaşanabileceğini belirtmiş
* Strong bir şifre kullanmam gerektiğini söylemiş
* Northwind'in hiç backup ının alınmadığını belirtmiş
* Northwind üzerinde Guest accountunun yetkisi olduğunu belirtmiş, önermemiş

Özetle "Service Pack 4 yükle rahat et" mesajını aldım:)

Belki karmaşık database lerde daha yönlendirici sonuçlar çıkacaktır, denemek lazım.

Aşağıdaki linkten download edebilirsiniz:
http://www.microsoft.com/downloads/details.aspx?FamilyId=B352EB1F-D3CA-44EE-893E-9E07339C1F22&displaylang=en

01 Mart 2007

Business Intelligence


Son yıllarda "Business Intelligence" kavramını sıkça duymaya başladık. Bu kavram ilk olarak 1989 yılında Gartner Inc. firmasında analist olarak araştırma yapan Howard Dresner tarafından kullanılmıştır. O tarihe kadar DSS (decision support system) ve EIS (executive information system) gibi karışıklık yaratan kavramlar kulanılmaktaydı. Kelime olarak iş zekası şeklinde tanımlanan ama aslında bence şu an için zekadan bahsedemeyeceğimiz bir kavram. Merkezinde veri madenciliği var aslında. Klasik veri madenciliğinde temel olan konu verileri çeşitli yöntemlerle analiz ederek bilgiye dönüştürmektir. Business Intelligence kavramını veri analizinin yanında ETL (Extract, Transform, Load) işlemlerini ve Raporlama ihtiyaçlarını daha geniş bir açıdan bakarak sağlayan çözümler olarak düşünebiliriz. Business Intelligence uygulamaları sayesinde karar vericiler,stratejik ve operasyonel kararlarında daha doğru ve hızlı adımlar atabilmektedirler. Burada zekadan çok aslında bir yönlendirme söz konusu. Bu nedenle karar destek sistemleri tanımı bana biraz daha doğru geliyor.

Dünyadaki BI çözümlerine baktığımızda;

3 database devi:
IBM DB2 Business Intelligence
Oracle Business Intelligence Solutions
Microsoft SQL Server: Business Intelligence Solutions


Database ürünü olmayan yazılım devleri:
SAP Business Intelligence
Business objects
SAS - Business Intelligence Software Solutions
Microstrategy
Cognos
Hyperion


Business Intelligence ın geleceği konusunda Gartner için araştırma yapan Andreas Bitterer ın tespitleri ise şu yönde;

* BI bir çok kurumdaki deneyimli IT Manager'ın kafasında ilk planda yer alıyor
* BI'ın bir proje olmayıp devamlı bir süreç olarak düşünülmesi gerekir.
* Sık karşılaşılan bir durum da data kirliliği. Fakat "bu gezegende data kirliliği problemini yaşamayan bir firma yok"
* Kurumların data çalışanlarına ihtiyacı var. Bu kişiler kurum içerisinde çok deneyimli kişiler olmayabilir ama datayı nasıl yöneteceğini bilen kişiler olmalı.

SQL Server Business Intelligence Solutions çözümlerini inceleme fırsatım oldu. 3 temel servis bulunmakta. Integration Services, Analysis Services, Reporting Services. .net kullanıcıları 2005 ortamında kendi Business Intelligence projelerini yaratıp data işlemlerinde kod parçacıkları yazabilmekteler. Kısmen incelediğim Sql Server Integration Service projesi içerisinde kullanabileceğimiz hazır 11 bulanık mantık algoritması kullanan fuzzy lookup kontrolleri ETL işlemlerinde bir hayli işe yarar gibi görünüyor.

05 Şubat 2007

Soundex ve Difference Fonksiyonları

Sorgulamalarda text alanlara ait arama işlemlerinde like metodunu sıklıkla kullanırız. Like güzel hoş ama, bilhassa büyük hacimli datalarda veya cleanbase olmasını istediğimiz sistemlerde bazen işimizi görmez. Bu gibi durumlarda çok basit iki string fonksiyonu kullanarak işimizi görebiliriz.Bunlar SOUNDEX ve DIFFERENCE fonksiyonları.

SOUNDEX basit anlamda bizim string ifademizi 4 haneli bir koda dönüştürür.Bu kodun ilk harfi string değerimizin ilk harfi olur. Daha sonraki harflerse aşağıdaki eşleştirme tablosundan o harfe karşılık gelen sayı olur.

  • 1 : B,F,P,V
  • 2 : C,G,J,K,Q,S,X,Z
  • 3 : D,T
  • 4 : L
  • 5 : M,N
  • 6 : R
  • Kod yok : A,E,H,I,O,U,Y,W

Select SOUNDEX('Chris'),SOUNDEX('Chrys') ifadesinden bize dönen değerler;

C620 ve C620 olacaktır.

Where koşulunda aşağıdaki şekilde kullanabiliriz:

SELECT ad FROM tableX WHERE SOUNDEX(ad)=SOUNDEX('Chris')
Bu sorgu sonucu benzerlik kodu 'Chris' ile aynı olan isimler döner.
DIFFERENCE fonksiyonu da bize bu 4 haneli kodlardan iki string arasındaki benzerliği vermektedir.
SELECT ad FROM tableX WHERE SOUNDEX(ad)=SOUNDEX('Chris')

Bu sorguyla da adı 'Chris' ile % 75 veya daha fazla benzer olan kayıtları sorguladık.

17 Ocak 2007

Aspnet_Profile Tablosundan Alanları Sorgulamak

Membership kontrolleri ASP.net 2.0 la gelen yeniliklerden birisi. Kullanıcı ile ilgili bir çok modül hazır olarak bulunmakta. Varsayılan alanlar haricinde, kullandığımız özel alanlar aspnet_Profile tablosunda tek bir sütunda tutulur ve aspnet_User tablosuyla UserId alanından ilişkilendirilmiştir. Bir asp.net web sayfasında kullanacaksak problem yok, database den direk bu kayıtları görmemiz gerekirse işimiz pek de kolay değil. Bu tarz bir ihtiyaçta aşağıdaki fonksiyon kullanılabilir.

aspnet_Profile.PropertyNames : Profil alanların isim ve pozisyonlarının tutulduğu sütun
aspnet_Profile.PropertyValuesString : Profil değerlerinin tutulduğu sütun


CREATE FUNCTION [dbo].[GetProfileProperty](
@profileName varchar(50),
@PropertyNames varchar(8000),
@PropertyValuesString varchar(8000)
)
RETURNS varchar(500)
AS
BEGIN

DECLARE @MyOutput varchar(1000)
SET @MyOutput=substring (
@PropertyValuesString,
convert(int,(substring(@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3,
(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 3)- charindex(@ProfileName,@PropertyNames,1) - len(@ProfileName) - 3))
)) + 1,
convert(int,(substring(@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1,
((charindex(':',@PropertyNames,charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1))-(charindex(':',@PropertyNames,charindex(@ProfileName,@PropertyNames,1) + len(@ProfileName) + 4) + 1)
))))
)
RETURN @MyOutput
END



Bu fonksiyonu kullanarak,

SELECT dbo.GetProfileProperty('Firma',PropertyNames,PropertyValuesString)
FROM dbo.aspnet_Profile

cümlesiyle tüm kullanıcıların firma bilgisini alabiliriz.

05 Ocak 2007

Tabloda Email Kontrollü Kolon Yaratmak

Eğer tablonuzda email alanı varsa ve siz her ihtimale karşı son noktada önlem almak istiyorsanız bir kaç adımda bunu halledeblirsiniz. Sql Server 2005 ve CLR kullanarak.

Önce bir C# fonksiyona ihtiyacımız var. RegEx kullanan basit bir fonksiyon.

public class clsEmailValidator
{
public static int ValidatePostaFormat(string email)
{
string regExPattern = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
@"\.[0-9]{1,3}\.[0-9]{1,3}\.)(([a-zA-Z0-9\-]+\" +
@".)+))([a-zA-Z]{2,4}[0-9]{1,3})(\]?)$";
System.Text.RegularExpressions.Regex regEx = new System.Text.RegularExpressions.Regex(regExPattern);
if (email.Length != 0 & !regEx.IsMatch(email))
{
return 0;
}
{
return 1;
}

}

}


Daha sonra Sql Server 2005'te bir assembly oluşturalım;

CREATE ASSEMBLY EmailValidator
FROM 'C:\Documents and Settings\harunp\My Documents\Visual Studio 2005\Projects\EmailValidator\EmailValidator\bin\Debug\EmailValidator.dll'

Sonra bu assembly i kullanan bir email validasyon fonksiyonu yaratalım.

CREATE FUNCTION ValidateEmail
(
@email nvarchar(80)
)
RETURNS int
AS EXTERNAL NAME EmailValidator.clsEmailValidator.ValidatePostaFormat


Sonra bu fonksiyonu kullanacağımız bir tablo yaratalım. Tek yapmamız gereken fark email alanını yaratırken bir koşul eklemek.

CREATE TABLE [dbo].[tblUser](
[ad] [nvarchar](80),
[soyad] [nvarchar](80),
[email] [nvarchar](80) CHECK ([dbo].[ValidateEmail]([email])=(1))
)


INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','test@test.com')

(1 row(s) affected)

INSERT INTO tblUser(ad,soyad,email)
VALUES('harun','pekşen','testtest.com')

Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "CK__tblUser__email__412EB0B6". The conflict occurred in database "Test", table "dbo.tblUser", column 'email'.
The statement has been terminated.


Değer email formatında olmadığı için tabloya insert edilemedi. Bu yöntemle geçersiz bir email adresinin veritabanına girişini son noktada kontrol etmiş oluruz.