c# Delegate nedir?

Delegeler methodların referanslarını tutan tiplerdir. Böyle söyleyince çok anlamlı olmuyor, değil mi? Bunu anlatmak için örnek kullanmak daha iyi olacak sanırım.

Öncelikle Şöyle bir delege tanımı yapalım;

        int a = 0;
        public delegate int mydelegate(int i1, int i2);

delegate tanımımız hazır. Şimdi de methodlarımızı oluşturalım. Kolay şeyler olsun. Birisi iki sayıyı çarpsın, diğeri toplasın;

        public int topla(int x, int y)
        {
            a = a + 1;
            return x + y;
        }
        public int carp(int x, int y)
        {
            a = a * 3;
            return x * y;
        }

Not  : a değişkenini ve methodlar içindeki kullanımını lütfen şimdilik kafamıza takmayalım. Şimdilik onlar yokmuş gibi düşünelim. a değişkenini bir sonraki örnekte kullanacağız.

Burada dikkat edilmesi gereken en önemli unsur, tanımladığımız methodların return değerleri ve girilen parametrelerin sayısı, sırası ve tipleri aynı olmalıdır. Dikkat ederseniz delege tanımımızın return tipi int, tanımladığımız metodların da öyle, yine dikkat ederseniz delegate tanımımız 2 adet int parametre alıyor, metodlarımız da öyle.

Şimdi delegeyi bir butonun onclick eventında nasıl kullandığımıza bakalım. Şimdilik ben tanımladığımız metodlardan topla metodunu kullanacağım.

        private void button1_Click(object sender, EventArgs e)
        {
            mydelegate d = new mydelegate(topla);
            MessageBox.Show(d(3,4).ToString());
        }

MessageBox bize popup olarak 7 değerini verecektir.

Şimdi madem kullanmayacaktık carpma metodunu niye tanımladık öyle değilmi? Delegeler sadece tek metodu refere etmek zorunda değildirler. Aynı anda 1 den fazla method refere edilebilir. Aşağıda yine örnek ile anlatmaya çalışalım. Bu örneğimizde a değişken tanımımızı da kullancağız.

        private void button1_Click(object sender, EventArgs e)
        {
            mydelegate d = new mydelegate(topla);
            d += carp;
            MessageBox.Show(d(3,4).ToString());
            MessageBox.Show(a.ToString());
        }

Butona basıldığında d delegemizin sadece çarma işlemini yaparak ilk çıkacak messageboxta 12  değerini verdiğini göreceksiniz. Fakat 2. messagebox bize 3 değerini gösterecek.

Demekki neymiş aslında delegeye tanımladığımız 2 metodumuz da çalışmış. Delegeye yeni bir methot eklemek istediğimizde gördüğünüz gibi += operatorunu kullandık. Bu size birşey hatırlatıyor mu? Genelde bir butonun örneğin oncilick eventına ekleme yaparken de bu operatörü kullanıyoruz değil mi? Evet. Çünkü eventlar da aslında delege tanımlarıdır.

Delegelerde birden fazla method ekleyebildiğimizi gördük. Bu metodları -= operatörü kullanarak çıkarabilirizde.

Aşağıda bu konu ile ilgili de örneğimiz var. Bunu deneyerek çıktılarını tahmin etmeye çalışın. Bakalım doğru tahmin edebilecek misiniz?

        private void button1_Click(object sender, EventArgs e)
        {
            mydelegate d = new mydelegate(topla);
            d += carp;
            d -= topla;
            d += topla;
            MessageBox.Show(d(3,4).ToString());
            MessageBox.Show(a.ToString());
        }

Sizce bu kodun çıktısı nedir?

TFS Local Path değiştirme (Change TFS Local Path)

File ->Source Control -> Advanced -> Workspaces…

Worksapace üzerindeyken “Edit” butonuna tıklayın. Buradan Local Folder’ı değiştirebilirsiniz. Değiştirme işlemini tamamladığınızda. “Workspace’i değiştirdiniz. Güncel dosyaların kopyalanmasını istermisiniz anlamına gelen bir soru ile karşılaşırsınız.” Evet e basarsanız. Projelerinizin son halleri yeni belirlediğiniz local folder a kopyalanacaktır.

İyi çalışmalar.

SQL bir string değerin hangi tablonun tangi alanında geçtiğini bulma

Eğer bir string değerin hangi tablolarda ve bu tabloların hangi alanlarında geçtiğini ya da geçip geçmediğini bulmak istiyorsanız alın size ufak ama bir o kadar da YAVAŞ çalışacak bir query;

declare
@query nvarchar(4000),
@tbl_name sysname,
@tbl_id int,
@column_name sysname

declare cursor_tbl cursor for
select s.name+'.'+o.name name, object_id 
from sys.objects o (nolock)
join sys.schemas s (nolock) on o.schema_id=s.schema_id
where o.type = 'U'

declare @aranacaktext nvarchar(100)
Select @aranacaktext = N'Bulunacak string'

open cursor_tbl

fetch next from cursor_tbl into @tbl_name, @tbl_id

while (@@FETCH_STATUS = 0)
begin
    declare cursor_col cursor for 
    select name from sys.columns (nolock)
    where object_id = @tbl_id 
    and system_type_id in (167, 175, 231, 239)

    open cursor_col

    fetch next from cursor_col into @column_name
    while (@@FETCH_STATUS = 0)
    begin
        select @query = 'if exists 
        (select * from ' + @tbl_name + '(nolock) 
        where ['+ @column_name +'] like ''%'+@aranacaktext+'%'') 
        print ''' + @tbl_name + ', ' + @column_name + ''''
        exec (@query)

        fetch next from cursor_col into @column_name
    end
    close cursor_col
    deallocate cursor_col

    fetch next from cursor_tbl into @tbl_name, @tbl_id
end

close cursor_tbl
deallocate cursor_tbl

MUTLULUK

Büyük kedi, kuyruğuyla oynayan küçük kediye sordu:

“Neden kuyruğunu kovalayıp duruyorsun?”

Küçük kedi şöyle yanıt verdi:

“Bir kedi için en güzel şeyin mutluluk, mutluluğun da kuyruğum olduğunu öğrendim,”  dedi. “Kuyruğumu kovalıyorum, kovalıyorum… Sonunda onu yakaladığım zaman, biliyorum ki mutluluğu yakalamış olacağım.”

Yaşlı kedi gülümsedi:

“Gençken bende senin gibi, mutluluğun kuyruğum olduğuna inanıyordum. Yıllar geçtikçe anladım ki, ne zaman onu kovalasam o benden uzaklaşıyor, ne zaman kendi işime baksam o hep peşimden geliyor.”

SQL (nolock)

SQL bazı drumlarda verileri kilitler. Örneğin bir tabloya update çekiyorsunuz ya da bir transaction başlattınız. Ama transaction henüz sonlanmadı. Bu tür durumlarda SQL dataya diğer connection’lardan erişimi durdurur.

Şimdi sizinle şöyle bir deney yapalım ;

SQL Server Management Studio’yu açalım ve “New Query” butonuna 2 defa tıklayarak 2 adet boş query penceresi açalım

nolock1

Management studio da 2 adet query penceresi demek, aslında sql server a oluşturulmuş 2 farklı bağlantı demektir. SQLQuery1.sql penceresinde yukarıda görüldüğü gibi  “Begin Tran” ve alt satıra bütün bir tabloyu UPDATE eden bir script yazın. Şimdi query i çalıştırın. Update ettiğiniz tabloya select çektiğinizde update ettiğiniz bütün alanların değiştiğini görüceksiniz. Aslında daha değişmedi siz “Begin Tran” ile başlattığınız transaction ı commit edene kadar hiçbir değişiklik veritabanına kaydedilmez ve siz commit verene kadar, yani “Commit Tran” yazana kadar SQL server tablodaki kayıtları kilitler. Kimse bu tablodan select ile bu verileri görüntüleyemez. Sizin çektiğiniz Select çalıştı ama değil mi. Bunun nedeni sizin Transaction ı başlattığınız aynı connection ile select çekiyor olmanız. Aynı Query Penceresinde olmak burada aynı connection da olmak demektir.

nolock2

Şimdi aynı select i açtığımız diğer Query Penceresinden yani SQLQuery2.sql den deneyelim

Select imizi SQLQuery2.sql penceresinde çektiğimizde, alt tarafta görüğümüz executing query yazısının sürekli orda olduğunu görürsünüz. Diğer connectiondan açtığınız transaction henüz tamamlanmadığı için verileriniz hala kilitli ve  onlara, şu anda başka bir connection da olduğunuz için ulaşamıyorsunuz. Bu select cümleciğinin size istediğiniz listeyi getirebilmesi için SQLQuery1.sql penceresinde, ilk resimde — işareti ile commitlenen”rollback tran” cümleciğini — işareti olmadan, yani commitsiz yazmalı ve çalıştırmalısınız. Tabi eğer yaptığınız Update e onay vermek istiyorsanız; “commit tran” cümleciğini de kullanabilirsiniz.

İşte böyle durumlarda çektiğiniz bir sorgunun bir nesnenin kilitli olmasına bakmadan size listesini getirmesini istiyorsanız yukarıdaki select cümleciğini şu şekilde yazmalısınız;

Select * from [AdventureWorks2008R2].[HumanResources].[Employee] (nolock)

Bu durumda sql ulaşmak istediğiniz verinin kilitli olup olmadığına bakmadan listeyi size vericektir. (Nolock) olayı bir çok durumda yapmış olduğunuz sorguların kilitleri beklemesini engelleyeceğinden programlarınızın daha hızlı çalışması için tercih edeceğiniz bir yöntemdir. Fakat yine de verilerin ne zaman nolock ile çekileceğine karar vermek dikkatli düşünülmesi gereken bir iştir. Çünkü verileriniz biryerlerde işleniyor ve süreç henüz sona ermedi. Siz sürecin sona ermesini beklemek istiyor musunuz? Yoksa bu durum sizin mevcut şartlarınızda önemsiz mi? Karar verilmesi gereken asıl nokta budur.

 

SQL Union All

Aynı sıra ile aynı veritipi bilgileri içeren 2 sorguyu birleştirmek istediğimizde birleştirmek istediğimiz query ler arasında “union all” kullanırız

Örneğin ;

SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Design Engineer'

şeklinde bir sorgumuz var çıktısı aşşağıdaki gibi

SQLUnion1

Burada görevi ‘Design Engineer’ olan çalışanları görüyoruz.

SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Marketing Assistant'

Sorgusunu yaparak ta görevi ‘Marketing Assistant’ olan çalışanların listesini alalım

SQLUnion2

Şimdi bu iki sorguyu “union all” ile birleştirelim.

SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Design Engineer'
union all
SELECT * FROM [AdventureWorks2008R2].[HumanResources].[Employee]
where [JobTitle]='Marketing Assistant'

Artık aşağıda gördüğünüz gibi iki sorguyu birleştirerek, görevi ‘Marketing Assitant’ ve ‘Design Engineer’ olan  çalışanların listesini almış olduk

SQLUnion3

CLOUD COMPUTING Aldatmacası

Son zamanlarda bir “Cloud Computing” hikayesi anlatılır oldu. Buna göre insanlar artık masaüstü uygulamaları kullanmak ve verilerini geleneksel bilgisayarlarında saklamak yerine, internet üzerindeki ortamlarda çalışacaklar ve dökümanlarını yine bu internet üzerindeki ortamlarda saklayacaklarmış. Büyük ölçekli firmaların artık kendi veritabanı serverlarını, file serverlarını almayıp, bunlar yerine internet üzerinde bir yer kiralayarak yada satın alarak uygulamalarını buralardan çalıştıracakları, paylaşılması gereken dökümanlarını buradan paylaşacakları, verilerini burada saklayacakları gibi laflar dolaşıyor ortalıkta. Şu anda bu söylenen şeyler bana pek gerçekçi gelmiyor doğrusu. Bu konu hakkında bir kaç makale okudum. Okuduğum makalelerde bu çalışma sisteminin faydası olarak ; Düşük Maliyetler, Yüksek depolama, Veri güvenliği alanları gibi şeylerden bahsediliyor. Haydi işiniz yoksa bunlar hakkında biraz düşünelim.

Birincisi ; Düşük Maliyetler. Genelde şöyle bir açıklaması var bu sistemi savunan arkadaşların; Bir iş kurarken yapmanız gereken donanım maliyetinden kurtulmuş olacaksınız diyorlar. Bu bence safsatadan başka birşey değil. İnternetteki o boş yeri de size bedava vermiyecekler sonuçta. Aylık ya da yıllık bir bedel ödeyeceksiniz mutlaka. Server alamayacağınız için (ama bu hizemete erişebilmek için bilgisayarınız olacak değil mi?), olmayan server’ınızın  bakımını ve ayarlamalarını yapmak için de personele ihtiyaç duymayacakmışsınız. Arkadaşlar yapmayın. Sizin bakım yapmak için adama ihtiyacınız olmayabilir ama o internet üzerindeki alanın hala bakıma ihtiyacı var ve bu hizmeti sağlayan arkadaşlar bu bakımı yapacaklar da. Tabi bunu hayrına yapmayacaklar. Bunun da bedelini faturanızda göreceksiniz. Bir de personelinizin bu hizmeti kullanabilmesi, internet üzerindeki o alana erişebilmesi için hala bilgisayara ihtiyacı var unutmayın. Onların bakımını kim yapacak peki? Geleneksel yöntemlerde şirket bünyesinde çalışan IT ekibi bu işleri de üstlenir. Demekki neymiş? Server haricindeki cihazlar için de birilerine ihtiyaç varmış. O halde demekki IT maliyetiniz olmak zorunda. Siz ne yaptınız IT maliyetine, size cloud hizmeti veren firmanın IT masrafını da eklediniz. Çünkü yukarıda dediğim gibi onların da bir bakım masrafı olacak ve bunu size yansıtmak zorundalar.

İkincisi ; Yüksek depolama kapasiteleri. Peta Byte yani 1 Milyon GB gibi depolama alanlarından bahsediliyor. Bu belki iyi bir özellik olabilir. Ama gene de büyüklüğün faturaya yansıyacağını düşünüyorum ben. Üstelik kullanılmayan işlevsiz büyüklüğün bile 🙂

Üçüncüsü; Veri güvenliği! Yaw veri nasıl olur da internette hiç bilmediğim bir bilgisayar üstünde hiç tanımadığım kişilerin ellerinde, benim dizimin dibinde duran istediğim zaman müdehale edebildiğim, istediğim antivirüs, firewall uygulamaları ile koruyup, istediğim gibi RAID yaptığım ve ne yaptığımı bildiğim ve yedeklediğim bir yerden daha güvende olur. En basitinden o hizmeti size sağlayan adamlara bile güvenebileceğinizi zannetmiyorum. Bence hiçbir şirket çok gizli ve(ya) değerli verilerini böyle bir ortamda tutmak istemez.

Benim bu CLOUD COMPUTING ten anadığım bunlar arkadaşlar. Eğer bu konu hakkında yanlış bir bilgim varsa yada yanlış kaygılarımın olduğunu düşünüyorsanız beni aydınlatın lütfen. Teşekkür ederim.

İstanbul

İstanbul aslında Türkiye’de yaşanması belki en zor şehir. Kalabalığı, karışıklığı, 3-4 km mesafedeki yerlere gitmenin araçla 1 saat, yayan olarak 30-45dk sürmesine sebep olan trafiği … Bugün yöneticimle konuşuyorum. İşten çıkıp eve gitmesi bazen 3 saat sürüyormuş. Harbiden yaşanacak yer değil bence. Ama malesef herşeyin merkezi İstanbul’da. Ve malesef herşey hala İstanbul’a yapılıyor. Bu durumda bütün bu saydığım yaşam zorluklarına karşın İstanbul iş bulması en kolay il haline geliyor. (en azından vasıflı işçi için)  Böylece de okulunu bitiren birçok kişi, belki kendi memleketlerinde hiç bir arayış içine girmeden, doğrudan istanbula geliyorlar. Çünkü herkes arasa da iş bulamayacağından emin. Bulsalar bile ne olacak? Genelde buldukları işlerden emeklerinin karşılığı olan parayı alamıyor (kendi işini kurabilen çok küçük bir azınlık dahil değildir sadece bu söylediğime). Çünkü çocuğun yaptığı işi (vasıflı işçi için konuşuyorum gene)  yapabileceği ya 1 ya 2 yer var. Buralarda çalışabiliyor. Bu durumda işverenin mantığı şöyle oluyor; ulan burdan çıksa nereye gidecek, mecbur çalışacak. Ve hakkını vermemekte diretiyor elemanının.  Buralarda kalanlar emeklerinin haklarını alamadıkları için mutsuz, gelenler şehrin stresinden … Siz hiç izliyor musunuz bilmiyorum yabancı TV lerde yayınlanan şaka programları var. Örneğin avrupa ülkelerinde insanların bu kamera şakalarına verdikleri tepkilere bir bakın. Aynı şakanın bizim ülkemizde yapıldığını düşünün birde. Adamı döverler. (Bu arada bizim ülkemizde yapılan bazı şakalar hakikatten tam sopalık onlardan bahsetmiyorum.) Çünkü bizde artık herkes gergin.

Bugün birkaç evrak işi için altı üstü 10 km lik bir mesafede 3 saatten fazla zaman harcadım. Beni bu yazıyı yazmaya iten sebep budur. Bütün bunları bu 3 saatin son 1 saatinde artık güneş kafama geçmeye başlayınca düşündüm. Hatalıysam uyarın. THE END.

SQL’de view içeriklerini şifrelemek

Normalde bir view oluştururken eğer bunu yazarak yapacaksak şöyle bir ifade kullanırız

Create view ViewAdi
as
Select * from TabloAdi

Bu view’ı görüntülemek için

sp_helptext ViewAdi

Komutunu verdiğimizde yukarıda yazdığımız create ile başlayan kodun karşımıza çıktığını görürüz. Eğer view’ı aşağıdaki şekilde oluşturursak ;

Create view ViewAdi with ENCRYPTION
as
Select * from TabloAdi

Bu defa sp_helptext komutu ile baktığımızda bize “The text for object ‘ViewAdi’ is encrypted.” şeklinde bir mesaj verecek ve içeriği göstermeyecektir. Ayrıca object explorer ile baksak ve view uzerinde sağ tuş tıklasak bile karşımıza Design seçeneği pasif olarak geleceğinden view üzerinde değişiklik yapmak yada kodu görmek mümkün olmayacaktır.

Oluşturma sırasında WITH ENCRYPTION kullanımı SP, FUNCTION ve TRIGGER lar da da aynı sonucu verecektir. Bu objelerin çalışmasında bir değişiklik olmayacak fakat kodu görüntülenemeyecektir.

1 2