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?

Phuket

Asia_Thailand_HKT_Phuket_Boat_CopyrightTayland’ın belki de en çok turist çeken bölgesi Dünyaca ünlü Phuket.Phi phi adaları, patong beachi vs ile tabi birçoklarının en azından kulağında aşinalık olan bölge.

Tabii burada kendi izlenimlerime geçecek olursak Tayland’ın diğer her yerinde olduğu gibi burada da gülümseyen insanlar hiç eksik olmuyor.Fiyatların en yüksek olduğu bölge sanırım Tayland’da burasıdır. ortalama bir lokantada yemek 20-30 tl ye mal oluyor.Tabi ki ucuz sokak satıcıları burada da var.Tercihe göre onlardan da yenilebilir ki restoranlarda yiyeceğiniz bazı yemeklerden lezzeti Türk damak tadına daha yakın bulabileceğiniz nimetler de var bu tezgahlarda .Özellikle seyyarlardan da alsanız restoranlarda da yeseniz deniz ürünlerini beğenebilirsiniz.Bir bira barlarda ortalama 200 Baht.(12 tl gibi bir fiyata denk geliyor.) Bazı yerlerde giriş ucreti olarak buna yakın(200baht gibi) rakamlar alınabiliyor fakat içeride bedava içki veriliyor, yani bu durum birbirini dengeliyor.Fiyatlar istanbul ortalamalarına göre halen makul, fakat Tayland’ın ülke genelinde her geçen yıl biraz daha pahalı bir yer olduğunu unutmamak gerek.Arz talep meselesi sanırım.Barları, diskoları ve gece hayatı gerçekten hareketli.Gündüzleri okyanusun serin sularına kendinizi bırakırken, geceleri kendinizi eğlenceye atabilirsiniz.Birçok yer doğa harikası.Phuket’te fillere binebilirsiniz.Çeşitli safari turlarına katılabilirsiniz.
Genel olarak bir alışveriş esnasında pazarlık şart gibi.Zaten Tayland pazarlık yapmayı sevenler için birebir.Bu noktada Tayland insanı her ne kadar sempatik olsa da, karşılarında kendileri gibi çekik gözlü olmayan bir turist gördüklerinde sattıkları ürün için normal istedikleri rakamın 3-5 hatta yerine göre 10 katını çekebiliyorlar.Tabi bu durumda sizin pazarlık enerjiniz, iletişim gücünüz çok önemli.Bu noktada benim en önemli tavsiyem mümkün olduğunca gülmeniz, gülümsemeniz hatta yeri geldiğinde kahkahalar atmanızdır.Eğer bunu yapabilirseniz hem Tayland insanı size aynı şekile karşılık verecek, hem pazarlığınız olumlu sonuçlanacak, hemde yaptığınız alışverişten keyif alacaksınız.Tabi burada çok önemli bir detay var ve Taylandlılar bu kısmın ne kadar farkındalar bilemiyorum: siz genellikle Turkiye gibi uzak bir ülkeden Tayland’a gittiğinizde ya iş için ya da tatil için gitmiş oluyorsunuz.Bu durum sizde bir zaman sıkıntısı yaratıyor.(Bende öyle oldu)Tayland gibi güzel bir ülkede zaman ilerledikçe aslında geçirdiğiniz dakikalarınızın dahi sizin için ne kadar kıymetli olduğunu anlamaya başlıyorsunuz.Dolayısıyla bu ülkede bir Taylandlı’nın 20tl fiyat çektiği bir tişörtü 5-10 liraya alabilmek için yarım saat pazarlık etmenin ne kadar anlamlı olup olmadığı da kişiden kişiye değişebiliyor.Unutmamak gerekir ki birçokları için de vakit nakit olduğundan örnek olarak verdiğim tişörtçüde lak lak etmek mi yoksa hemen mekan değiştirip farklı birşeyler görmek mi mantıklı, bunun tercihi size kalıyor; ki ben birçok yerde daha ucuza alabileceğimi farkettiğim şeyleri sırf bu zamanı kaybetmemek adına pazarlığı uzatmadan ederinden daha pahalıya aldım.
İklim kısmına gelince, Tayland ağırlıklı olarak yılın 2-3 ayı etkisini gösteren, gün içerisinde 10-15 dakikalık atışlar şeklinde hayatınızda belki de başka hiçbir yerde göremeyeceğiniz kadar şiddetli yağmurların görüldüğü tropikal iklim kuşağının etkisi altında.Yağmurlar değil bir bardak adeta kovadan boşanırcasına yağabiliyor ve düz yolda yürürken dahi ayak bileklerinize kadar sular yükselebiliyor.Fakat bu Taylandlılar’ın elbette çok alışık olduğu bir şey.Bölgeyi iyi bilen turistlerde eğer bu tip yağmurlar başlarsa çevredeki açık bar ve publara oturup birlarını yudumlarken yağmuru ve şiddetini keyifle izlemeye koyuluyorlar.Yağmurların yağdığı mevsim ağustos sonlarından ekim sonlarına kadar fakat bu periodda dahil olmak üzere Tayland’da her daim yaz mevsimi hakim.Sıcaklık örneğin bizim yazın Antalya’da gördüğümüz 40-45 derecelere kadar pek ulaşmasada nem oranının yüksek olması sebebiyle zaman zaman nefes almak dahi güçleşebiliyor.Gece hava biraz daha serinlese de bunaldığınızı geceleri de hissedebiliyorsunuz.Bu durum yaşlılar ve çocuklar için belki bir problem yaşatabilir.Fakat iç mekanların neredeyse tamamı klimalı olduğu için aynı sıkıntıyı kafe, bar, market, alışveriş merkezi gibi yerlerde yaşamazsınız.Belki tam tersi de olabilir, çünkü bazı mekan sahibi Taylandlılar klima kullanımı konusunda ayarsız olabiliyorlar ve özellikle ben Seven Eleven isimli marketlerde bazen adeta donduğumu hissettim.:)

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

Kendi İşine Bak

Dikkatinizi gerçekten sizi ilgilendiren şeyler üzerine odaklayın ve başkalarının işlerinin sizi ilgilendirmediği konusunda açık bir görüşe sahip olun.

Eğer bunu uygularsanız baskı altına girmezsiniz ve kimse sizi etkileyip geriye döndüremez. Gerçekten özgür ve etkin olursunuz. Çabalarınız iyi şeylere yönelir ve başkalarının hatasını bularak ya da onlarla zıtlaşarak çabalarınızı aptalca ziyan etmezsiniz.

Neyin gerçekten sizi ilgilendirdiğini bilir ve bu bilinçle düzenli bir şekilde haraket edersiniz, iradeniz dışında hiçbir şey yaptırılamaz hale gelirsiniz.

ama amacınız bu ilkelerle yaşamak bile olsa, bunun kolay olmayacağını aklınızda tutun. Bazı şeylerden bütünüyle vazgeçmelisiniz ve şimdilik bazılarından vazgeçmeyi bir sonraki zamana bırakmalısınız. Mutluluk ve özgürlüğe erişmek istiyorsanız zenginlik ve güç peşinde koşmaktan vazgeçmelisiniz

EPİKTETOS (Romalı bir köle)

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.

1 2