12 Aralık 2006

Tek Kolonda Tutulan Çoklu Değerler

Veritabanımızda bir verinin değeri birden fazla değerden oluşabiliyorsa (checkbox), bu durumda bu alanları saklamak için 2 yöntem kullanabiliriz. Birincisi bu değerleri bir key ilişkisiyle ayrı bir tabloda satırlar halinde tutmak, ikincisi ayırıcı bir karakter yardımıyla bu değerleri tek bir alanda tutmak. Birinci yöntemde raporlamada problem yaşanmaz, fakat ikinci yöntemde bu değerlerin gösterimi ve analizi biraz daha zor olacaktır.
Böyle bir durumla karşılaşırsak yazacağımız bir Split fonksiyonuyla işimizi kolaylaştırabiliriz.

Alan değerimizin izlenen TV kanalları olduğunu varsayalım. Değerleri de;

1: ATV
2: KANAL D
3: SHOW TV
4: NTV
5: CNN TURK


olsun. Ayırıcı işaret olarak ";" kullandığımızı varsayalım.

--Önce Split fonksiyonunu yazalım;

CREATE FUNCTION [dbo].[Split] (@Str NVARCHAR(500), @Delimiter CHAR(1))
RETURNS @Results TABLE (Rows nvarchar(4000))
AS
BEGIN
DECLARE @Indx INT
DECLARE @Prt NVARCHAR(4000)
SELECT @Indx = 1
IF @Str Is NULL RETURN
WHILE @Indx != 0
BEGIN
SELECT @Indx = CharIndex(@Delimiter, @Str)
IF @Indx != 0
SELECT @Prt = left(@Str, @Indx - 1)
ELSE
SELECT @Prt = @Str
IF (@Prt!='0' and @Prt!='') INSERT INTO @Results(Rows) VALUES (@Prt)
SELECT @Str = right(@Str, Len(@Str) - @Indx)
IF Len(@Str) = 0 BREAK
END
RETURN
END

Daha sonra test için bir kullanıcı tablosu yaratalım,
CREATE TABLE [dbo].[UserInfo](
[userid] [int] NOT NULL,
[Email] [varchar](100) COLLATE Turkish_CI_AS NOT NULL,
[channel] [varchar](100) COLLATE Turkish_CI_AS NOT NULL
)

Sonra bu tabloya test kayıtları ekleyelim

INSERT INTO [dbo].[UserInfo](userid,Email,Channel)
VALUES (887,'test1@test.com','1;0;0;4;5')
INSERT INTO [dbo].[UserInfo](userid,Email,Channel)
VALUES (965,'test2@test.com','1;0;3;0;0')

Daha sonra kanal seçim tablosunu oluşturalım
CREATE TABLE [dbo].[Channels](
[userid] [int] NOT NULL,
[Channel] [int] NOT NULL
)

Yazdığımız Split fonksiyonunu kullanarak kayıtları ekleyelim
DECLARE @channel varchar(200)
DECLARE @userid varchar(200)
DECLARE @cr_channel CURSOR
SET @cr_channel = CURSOR FOR
SELECT channel,userid FROM dbo.UserInfo
OPEN @cr_channel
FETCH NEXT FROM @cr_channel INTO @channel,@userid
WHILE ( @@FETCH_STATUS = 0)
BEGIN
INSERT INTO
Channels(userid, channel)
SELECT @userid, * From Split (@channel,';')
FETCH NEXT FROM @cr_channel INTO @channel,@userid
END

Channels tablosunda userid ve Channel olarak satır bazlı kayıtlarımız oluştu. Bu kayıtları artık çok rahat bir şekilde kullanabiliriz.

07 Aralık 2006

Delete Ve Truncate Komutları Arasındaki Fark

Bazen çözüme ulaşmak için kullanımı aynı gibi görünen farklı yöntemler kullanıyoruz. DELETE ve TRUNCATE ikilisi de bunlardan biri aslında. Peki ikisi arasında ne fark var? Aslında bu farklar bir hayli fazla.

DELETE komutunda işlem sonunda satırlar fiziksel olarak silinir ve satır bazlı olarak loglanır. Bu yüzden yüksek miktarda satıra DELETE işlemi sık periyotta uygulandığında log file zamanla büyük boyutlara ulaşacaktır. TRUNCATE komutu da loglama yapar;fakat farklı bir yolla. TRUNCATE komutu işleme tabi tutulan tablodaki kayıtları bulunduğu pagefile ları işaretler. Aslında TRUNCATE işleminde data silinmeyip daha sonra kullanılmak üzere işaretlenmektedir. Bu da TRUNCATE işleminin DELETE işlemine göre çok daha performanslı çalışmasını sağlar.

DELETE komutu Foreign Key veya diğer Constraint lere zarar vermeden kayıtları siler.
Foreign Key Constraint i olan bir tabloya TRUNCATE işlemi uygulanamaz. Önce Constraint lerin silinip, TRUNCATE işleminden sonra tekrar tanımlanması gerekecektir. Ayrıca bu işlemi yapacak olan user ın db_owner,ddl_admin veya owner haklarından birisine sahip olması gerekir.

TRUNCATE işlemi sonunsa Identity alan değerleri ilk değerlerinden tekrar başlar. Örneğin 1'den başlayan Identity değeri olan ve içerisinde 100 satır bulunan bir tablo olduğunu varsayalım. TRUNCATE işlemi sonunda boş tabloya bir satır eklediğimizde alacağı değer 1 dir, fakat DELETE işleminden sonra bu değer 101 olacaktır.

06 Kasım 2006

Sql Server'da Lock Yönetimi

Sql Server kullanan ve gerçek zamanlı çalışan uygulamalarda lock lar çok sık yaşanmaktadır. Uygulama geliştirici olarak düşündüğümüzde lock ların oluşması kötü bir durumdur ve sağlıklı çalışan sistemlerde en aza indirmek gerekmektedir. Peki lock neden oluşur? Database engine veri tutarlılığını sağlamak amacıyla bir kaynağa sadece bir thread in erişmesine izin verir. Lock kullanılmadığı durumda aynı veri farklı prosesler tarafından çeşitli işlemlere maruz kalacaktır. Özetle veri tutarlılığını sağlamak adına lock lar aslında faydalı bir durumdur.

Veritabanı yöneticisi için lock ların yönetilmesi bir zorunluluktur. Çok sayıda lock oluşan sistemlerde çözüm olarak; lockların hangi sayıda oluştuğu, hangi proseslerde daha fazla oluştuğu ve hangi frekansta lock ların oluştuğu izlenmelidir.
Sistemde transaction sayısı fazlaysa veya aynı kaynağa ulaşan uygulama sayısı fazlaysa lock lar oluşacaktır.Lock oluştuğu tespit edilen kaynak üzerinde işlem yapan prosesleri sınırlandırmak bir çözüm olabilir.

İzleme aşamasında sql server 2000 de bulunan sp_lock prosedürü lock ları listelememizi sağlar. Bu prosedür master database deki lock bilgilerinden lock detaylarını bize verir. Her lock için "granted","converting","waiting lock" gibi lock durumlarını görebiliriz.

EXECUTE sp_lock cümlesini çalıştırdığımızda;
spid, dbid, objid, indid, type, resource, mode, ve status kolonlarını görebiliriz. Bu veri aslında bize tam olarak açıklayıcı bir bilgi vermeyecektir.

spid sql server a yapılan bağlantının kimlik numarasıdır.
execute sp_who kullanarak o spid nin hangi user tarafından oluştuğunu görebiliriz.

dbid lock ın oluştuğu database id sini verir.
SELECT * FROM sysdatabases cümlesini kullanarak o database id nin hangi database i gösterdiğini bulabiliriz.

objid database de hangi nesnede lock oluştuğunu gösterir.
Master database inde SELECT * FROM sysobjects cümlesiyle tüm nesne detaylarını görebiliriz.

Bir kaç lock oluştuğunda izlenmesi kolay olabilir ama 1000 civarında lock oluşan bir uygulamada izlemek pek de kolay olmayacaktır. Ayrıca lock ları her listelememizde farklı bir kayıt seti alacağız. Bunun nedeni her an yeni lock ların oluşması ve eski lock ların serbest kalmasıdır.
Eğer aynı id ye sahip çok sayıda lock varsa bu proses büyük transactionlar içerir ve diğer transaction ları da etkiler. Bu durumda
DBCC INPUTBUFFER(spid) cümlesini çalıştırarak EventInfo bilgisini görebiliriz.

Yavaş çalışan sistemlerde çok fazla lock oluşacağını söyleyebiliriz. Lock lar genellikle bir kaynağı uzun süre kullanan yani esir alan uzun sorgulardan veya aynı kaynağı kullanmak zorunda olan iki kritik proses (deadlock) sebebiyle oluşur. Çözüm olarak genelde tercih edilen kill process işlemi bilhassa çok fazla lock oluşan sistemlerde iyi bir çözüm değildir. Tek çözüm lock ları analiz edecek bir sistem geliştirmektir. Bu analiz sonucunda uygulamada çeşitli değişiklikler yapıp lock ları en aza indirmek gerekecektir.

04 Kasım 2006

Yazılımda Konu Uzmanlığı

Yazılımı profosyonel meslek olarak seçenlerin veya seçmeyi düşünenlerin yaşadığı en büyük sıkıntı yeniliklere adapte olamamak denilebilir. Her yıl değişen yeni versiyonlarla birlikte gelen,değişen syntax lara ayak uydurmak,değişen veri tiplerine alışmak gibi sıkıntılara bir de diğer geliştirme ortamlarını takip ederek zaman içerisinde onların da kullanılabileceği ve geçiş yapılabileceği ihtimalini düşünerek değerlendirmek gerekmektedir. Aslında bu bahsettiğimiz sıkıntılar sadece kesin olarak yazılım uzmanlığını seçenler için geçerli. Eğer bu konu da tam olarak net değilse "hangi birine yetişeceğiz" tarzında veryansınlar başlamaktadır. Aslında önce bu konuyu aşmak gerekir. Daha sonra da uzmanlaşılacak bir platform belirlenmesi gerekmektedir. Bu kararı verirken platformun kullanım yüzdesi, gelişim tahmini, geçişin kolaylığı, çalışanların ne kadar kazandıkları gibi kriterleri yaklaşık olarak değerlendirdikten sonra kesinlikle birine odaklanmak gerekmektedir. İşe önce tüm platformlarda aynı derecede uzman olunamayacağı gerçeğinin kabul edilmesiyle başlanmalıdır. Bence tüm teknolojilerin bilinmesi göründüğü kadar büyük bir fayda sağlamayacaktır. Tabii ki platform uzmanlığı diğer teknolojilerin yok sayılması anlamına gelmez. Detaylara inmeden farkları bilmek, artıları ve eksileri bilmek güzel bir durum olacaktır. Platform seçimi kararı aslında bundan sonra çalışılacak işleri, yazılım geliştirirken yaşanılan zorluğu, alınan keyfi, kazanılan maaşı, bir kaç yıl sonraki kariyeri, hobi olarak hangi konuların takip edileceği gibi konuları belirleyecektir. Aslında tüm bunların derecelerini kişinin konusunda ne kadar uzman olduğu etkiler. Uzmanlık da aslında kişinin teknik altyapısı, yeteneği, hevesi, aldığı eğitimler, doğru işlerle ilgilenme oranı ve uzmanlığını pazarlayabilme yeteneğiyle doğru orantılıdır. Aslında daha da önemlisi bu uzmanlığı değişen şartlarda koruyabilmektir. Bir diğer gereksinim database programlama, database yönetimi, uml, sistem analizi, test standartları, dökümantasyon standartları,iş analizi gibi yan konularda uzmanlıktır. Aslında ideal yazılım süreçlerinde tüm bunlar yazılım geliştirici gibi ayrı bir pozisyon ve uzmanlık gerektirmektedir. İdeal şartların genelde uygulanamadığı ülkemizde bunların bir kısmı, bazen hepsi yazılım geliştiriciden beklenmektedir. Zorunluluk olarak yapılan bu konular aslında birer fırsat olarak görülebilir. Yatkın olunulan ve daha çok sevilen konunun uzmanlığı profesyonel olarak bu konudan para kazanma şekline dönüşebilir. Ben de belli bir deneyim süresinden sonra bu tarz uzmanlıklara kayıp, daha az kod yazma pozisyonlarının tercih edilmesini öneriyorum.

Bir kaç madde ile özetleyecek olursak;

* Uzmanlık alanını belirlemek. Odaklanmak. Konusunda en iyi olmak.
* Uzmanlık alanı olamayn diğer teknolojileri takip etmek.
* Esnek olmak. Yeniliğe açık olmak.
* Diğer uzmanların neler yaptığını anlamaya çalışmak.
* Tüm gelişimi uzun ve kısa vadeli ayrı planlarla belirleyip, uygulamasını kontrol etmek.

Sql Server Ce Üzerinde Rda Limitleri

Microsoft® SQL Server™ 2000 Windows® CE Edition (SQL Server CE) üzerinde Remote data access (RDA) metodunu kullanırken aşağıdaki limitleri göze almamız gerekmektedir;

* Büyük – küçük harf duyarlılığı
SQL Server CE veritabanı büyük-küçük harfe duyarlı değildir.
* Triggers
SQL Server CE veritabanı tirgger ları desteklemez, bu yüzden Pull metodu çalıştığında tablo üzerindeki trigger lar tepki vermeyebilir. Değişiklik yapılan tablolarda, SQL Server trigger ları push metoduyla geri gönderilen kayıtlar için çalışır. Trigger mantığında SET NOCOUNT ON şartına gerek duyulabilir. Bu durumda hiç bir kayıt etkilenmeyecektir, çünkü RDA push metodu için hiç bir kaydın etkilenmemesi durumu bir hata oluşturur.
* Tablolar ve kolonlar
Değişiklikleri izlenen tablolarda kullanılabilecek kolon sayısı 253’tür (255 - 2 sistem kolonları). SQL Server CE iki sistem kolonu için yer ayırır: S_BinaryKey ve S_Operation. Bu kolonlar korumalıdır ve RDA tablolar izlenirken kullanılır.
* Hesaplanmış kolonlar
Hesaplanmış kolonlar; bir kolonun değerinin bir veya bir kaç kolona bağlı olark değiştiği kolonlardır. Hesaplanmış kolonlar RDA metodunda desteklenemz . Pull metodu hesaplanmış kolonları içeren veri setlerinde hata almaktadır.
* Şema Limitleri
SQL Server CE kendi tabloları üzeirndeki değişiklikleri izleme özelliğine sahiptir. SQL Server CE tabloları üzerindeki tüm insert, update, delete işlemleri izlenir. Uygulama tüm bu izlenen değişiklikleri Push metoduyla SQL Server veritabanına aktarır.

RDA Pull ve Push metodlarıyla kayıtları izlerken iyimser bir yol izler. Pull metoduyla alınan kayıtlar SQL Server tarafından kilitlenmez. Uygulama Push metoduyla tüm izlediği değişiklikleri koşulsuz olarak SQL Server’a aktarır. Bu durum diğer SQL Server kullanıcılarının yaptığı değişikliklerin kaybolmasına neden olacağı için problem yaratabilir.
Pull ve Push metodları birbirinden farklı olarak bölümlenmiş işlemlerde kullanılmalıdır. Örneğin, izlenen Pull ve Push metodları herbiri tekil listelere sahip saha elemanlarının kullandığı uygulamalarda kullanılabilir.

İzlenen Pull metoduyla oluşturulan SQL Server CE tablosuna aşağıdaki değişiklikleri uygulayabilirsiniz.
- Identity kolonun artış miktarını değiştirmek
- Varolan sınırlamaları eklemek veya silmek.
- Yabancı anahtarları eklemek veya silmek
- İndeksleri eklemek veya silmek
- Tabloyu eklemek veya silmek

İzlenen Pull metodunun işlemi hala devam ederken aşağıdaki değişikliklerin hiç birini yapmayın. Bu değişikliklerin yapılması halinde SQL Server CE tablosunun silinip Pull işleminin yeniden yapılması gerekmektedir.
- Kolon eklemek, silmek veya ismini değiştirmek
- Tablo ismini değiştirmek
- Birincil anahtarı silmek
- Tanımlanan veri tiplerini değiştirmek

Kaynak: msdn.microsoft.com

Çevik Programlama

Çevik Programlama Manifestosu der ki;
* Kişilere ve onların iletişimlerine, süreçlerden ve araçlardan
* Yazılımın çalışmasına, detaylı dökümantasyonundan
* Müşterinin sözüne, yapılan sözleşmeden
* Değişime açık olmaya, bir planı takip etmekten
daha fazla önem veriyoruz.

Sağ taraftakilerin değerini bilip sol taraftakilere daha fazla değer veriyoruz.
ve aşağıdaki prnsipleri izler;
* İlk önceliğimiz yazılımı müşteriye daha önce teslim etmek ve yazılımın kalitesini devamlı olarak sürdürerek müşteri memnuniyeti sağlamaktır.,
* Müşteri isteklerindeki değişiklikler development ın sonunda da olsa hoş karşılanır. Atik programlama sayesinde müşteri rakipleri karşısında avantaj sağlar.
* Yazılım versiyonlarını ulaştırma sıklığı, bir kaç haftadan bir kaç aya kadar varan zaman dilimlerinde mümkün olduğu kadar sık olarak tercih edilmelidir.
* Yazılım geliştiriciler ve müşteriler (veya müşteri ihtiyaçlarını yöneten müşteri temsilcileri) proje boyunca her gün bir miktar vakit geçirmelidir.
* Projeye istekli kişilerle başlanmalı, verimli çalışabilecekleri bir ortam yaratılmalı, istekleri yerine getirilmeli ve onlara güvenilmelidir.
* Yazılım geliştiricilere aktarılması gereken bilgiler veya geliştiricilerin kendi arasında birbirine aktarması gereken bilgiler kesinlikle yüz yüze aktarılmalıdır.
* Yazılımın çalışması geliştirme sürecinin birinci ölçütüdür.
* Atik programlama sürekli geliştirmeyi gerektirir. Sponsorlar, geliştiriciler ve kullanıcılar uzun bir süre belli bir hıza sahip olmalıdırlar.
* Teknik kaliteye ve iyi tasarıma sürekli dikkat etmek atikliği arttırır.
* Basitlik yapılmamış işin miktarını maksimize etme sanatıdır.
* En iyi mimariler, analizler ve tasarımlar kendi içerisinde iyi organize olmuş ekiplerden çıkar
* Takım belirli aralıklarla nasıl daha verimli çalışacağını düşünür ve daha sonra bu karara göre hareket eder


Eğer;
Hiç süreciniz ve hiç aracınız yoksa,
Takip edeceğiniz bir planınız yoksa,
Gereksinim analizi iyi yapılamıyorsa,
Geliştiriciler her şeye rağmen yine de motive olmuyorsa,
Müşteriye düşündüklerinizi anlatamıyorsanız,
Müşteri size düşündüklerini anlatamıyorsa,
Yazılım geliştiriciyle diyalog kuramıyorsanız,
Hala takım olamadıysanız,

Çevik Programlama ne yazık ki size bir fayda sağlamayacaktır

Kaynak:http://www.agilemanifesto.org