October 28, 2008
@ 10:03 AM
MVP Global Summit 2008'de lanse edilen ve önemli özelliklerinden bahsedilen Dev10 yani vs.net 2010'un  CTP haberini sonunda gördük :)

Evet evet, şaka gibi ama değil, şunun şurasında 2010'a ne kadı ki :) değil mi ?

Aşağıdaki adresten indirebilir

http://www.microsoft.com/downloads/details.aspx?FamilyID=922b4655-93d0-4476-bda4-94cf5f8d4814&DisplayLang=en

şurdaki adresten de

http://msdn.microsoft.com/en-us/vs2008/products/cc948977.aspx

detaylı bilgi edinebilirsiniz.


 
Categories: .NET

September 25, 2008
@ 05:11 PM
Madem kampanya baslamis ben de destegimi veriyorum.
Oldum olasi ukala tipli Elmalardan  hoslanmadim, hele de anlamsiz reklam kampanyalarindan hic!

iyisi kotusuyle "I'm a PC and  I'm a Developer" diyorum.


Burdan da diger videolara erisebilir indirip izleyebilirsiniz. Ozellikle Jerry'nin rol aldigi reklamlar oldukca eglenceli.


 
Categories: Internet

Microsoft klasiği olan bir klasik olan Service Pack haberi ile yine karşınızdayız :)

Özellikle WPF ile ilgili çalışmalar yapanların şiddetle kurmalarını tavsiye ediyorum.Şurdaki linkden bu service pack ile neleri tamir ettikleri hakkında detaylı bilgi mevcut.

Burdan Vs.NET 2008 ( 831.3 MB lik iso dosyasi da şurda) ve burdan da .NET Framework 3.5 için gerekli Service Pack leri indirebilirsiniz.

Overview kısmına gözatmanızda fayda var derim. Kurulumdan önce de readme dokümanını okuyunuz. Örneğin vista kullanıcıları için

Visual Studio 2008 SP1 installation fails when the Windows Vista sidebar is on.

To resolve this issue:

1. Right-click the Sidebar icon in the notification area, at the far right of the taskbar.
2. Click "Exit".

açıklaması ile beni benden almıştır :)))))

 


 
Categories: .NET

Orta çaplı ya da büyük boyutlu uygulamalarda genellikle uygulama birçok kişi ya da birden fazla takım tarafından geliştirilmekte ve kayank kod kontrolü programları ile ( source safe, cvs, svn gibi ) projelerini yönetmektedirler.Asp.net uygulamalarında, web.config dosyasında  kişilerin ya da takımların kendilerine özel appSettings altında tutacak değerleri veya connectionStrings altında tutacak farklı veritabanı bağlantı bilgileri olabilir. Kimi durumlarda "check out" edilen web.config üzerinde degişiklik yapıldıkdan sonra ( ki bu bazen ekleme bazen de düzenleme olabilir ) "check in" yapılarak tekrar güncellenir. Bu kimi durumlarda birçok hataya ve aksaklığa neden olabiliyor. Bu durumda ilk akla gelen çözüm tüm uygulamada ortak kullanılacak değerler web.config dosyasına konur, test amaçlı, kişiye özel ya da takıma özel kısımlar ise harici bir dosyada tutulara web.config dosyası ile ile ilişkilendirilebilir.

Örneğin A takımının tüm projeden bağımsız kendisine özel bazı değerleri ve yine kendisine özel veritabanı bağlantısı bilgilerini harici olarak tutmak istediğini ama tüm projedeki ortak değerleri ve veritabanı bağlantı bilgilerini de kulanmak istediğini düşünelim. Bu durumda kendisine ait özel verileri web.config haricinde başka bir dosyada tutup, web.config dosyasında da bazı düzenlemelerden sonra diğer takım arkadaşlarının ya da aynı web.config'i kullanan diğer takımların başını ağrıtmayacaktır :)

Resimden de görüldüğü gibi projeme connectionstring lerimi ve appsetting lerimi yerleştirmek için iki ayrı dosya ekledim ( dosya isim ve uzantilarında zorunluluk yoktur. )

Ateam_local_connections.config dosyasının içeriği aşağıdaki gibi;

<connectionStrings>
  <add name="Atakiminaozelbaglanti" connectionString="Atakimi baglanti bilgileri..."/>
</connectionStrings>

Ateam_local_settings.config dosyasının içeriği de

<appSettings>
  <add key="Atakiminaozel" value="beniAtakimiOkur"/>
  <add key="exts" value="jpg,png"/>
</appSettings>

gibidir. web.config dosyamızı da aşağıdaki gibi düzenledikten sonra test edebiliriz.

<appSettings file="Ateam_local_settings.config">
    <add key="globalValue" value="Beni herkes bilir!"/>
</appSettings>
<connectionStrings  configSource="Ateam_local_connections.config">
</connectionStrings>

bu kısımda dikkat edilecek nokta connectionStrings kısmına eğer harici bir dosya kullanacağınızı tanımlarsanız <connectionStrings> tagları arasına başka bir connectionstring tanımlaması yapamıyor oluşunuzdur.

Test kodumuz aşağıdaki gibidir.

    protected void Page_Load(object sender, EventArgs e)
    {
        //genel appSettings okunuyor
        Response.Write(ConfigurationManager.AppSettings["globalValue"]);
        
        //A takimina ozel degerler okunuyor
        Response.Write("<br>"+ConfigurationManager.AppSettings["Atakiminaozel"]);

        //A takimina ozel connectionString okunuyor
        Response.Write("<br>"+ConfigurationManager.ConnectionStrings["Atakiminaozelbaglanti"].ConnectionString);
    }
 

Saç baş yolduran problemsiz çalışma ortamları dilerim :)


 
Categories: Asp.net | Code | Inceleme

July 30, 2008
@ 09:54 AM

BT Akademi 3. yaşına girdi. Gelişen yapısı ve büyüyen iş hacmi ile sektördeki kalitesini daha da artırarak 3. yaşına giren BT Akademi ailesini tebrik ediyorum. Nice nice senelere.

 

 

 

 

 
 
Categories: Yasam

July 30, 2008
@ 09:17 AM

Sevgili Sefer Algan ve Burak Selim Şenyurt ile kısa bir süre önce beğeni ile takip edilen  .NET Radyo'nun 3. ve 4. bölümlerini c#nedir?com da yayınlandı.

3. bölümde ORM ve LINQ konusunda merak edilen ve  sıkça hakkında soru aldığımız Object Relational Mapping kavramı ve LINQ to SQL yaklaşımı üzerinde duruldu. ORM araçlarının amaçları, kullanım alanları , avantaj ve dezavantajları üzerinde durduk.

4.bölümde ise Yeni .Net Kavramları konulu söyleşiyi gerçekleştirdik. .Net Framework 3.0, 3.5, Asp.Net 3.5, Futures, Volta, WCF, WPF, Silverlight, Astoria gibi pek çok kavram üzerinde kısaca durmaya çalıştık. Amaç Microsoft ürünleri ile uygulama geliştiren uzman ya da yeni başlayan geliştiricileri kavram kargaşısından bir nebze de olsa kurtarmayı amaçladık.

Çok kısa bir süre sonra diğer .NET Radyo'ların hazırlanmasına başlayacağımızı belirteyim.


 
Categories: .NET | Inceleme | Yasam

Kaynak kodları sizde olmayan bir dll'inizin olduğunu düşünün (.net frameworkdeki tüm dll lerin kaynak kodu yok ki zaten bizde) içinde onlarca tip ve bu tiplere ait metodlar, özellikler vs vs. Peki siz " yahu şu xxx tipinin yyy metodu private değil de public olsaydı oh ne güzel tak tak çağırır kullanırdım" diye aklınızdan geçirdiğinizde ilk yapılacak iş Reflection ile private metodu çağırmak olurdu ki, hem kullanması biraz karşık - parametrelerin uyum kontrolu, tip kontrolü, koddaki kirlilik de cabası - hem de performans sorunundan dolayı tam düşüncelerimizdeki o "sadeliği :) " gerçekleyemiyor :))  o zaman yapılacak iş dll'i açık private metodu public yapıp sonra aynı dll'i bozmadan tekrar kaydetmek... Bu işi yapan çok güzel bir aracı sizlere tanıtmak istiyorum...

Şurdaki adresten edinebileceğimiz aracı kurdukdan sonra test amaçlı bir dll projesi oluşturup public ve private üye elemanlar içeren bir tip ekleyip dll'i oluşturalım.

using System;
using System.Collections.Generic;
using System.Text;

namespace DllEditTest
{
    public class DummyObject
    {
        public string GetXml()
        {
            return "<xml>";
        }

        private void Cagiramazsinki()
        {

        }
    }

    class SecretObject
    {
        private int _price;
        public int Price
        {
            get { return _price; }
            set { _price = value; }
        }
    }
}

Örnek Dll'i test edecek bir uygulama oluşturup, kullandığımızda SecretObject isimli tipe beklediğimiz gibi erişmediğimizi görürüz.

Yine beklediğimiz gibi DummyObject sınfından bir nesne oluşturduğumuzda  Cagiramazsinki isimli private metodun görünmediğini görürüz.

 

Şimdi CFF Explorer uygulamasını başlatıp ilgili dll'i bu uygulama ile düzenlemek için ( File -> Open ) açalım. Aşağıdaki resimdeki gibi dll'in içerisindeki erişilebilen tipin metod bilgilerine erişelim.Dikkat ederseniz sadece erişilebilen public metodlarının listelendiğini göreceksiniz. Listeden Cagiramazsinki isimli private metodu seçtip sağ kısımda Flags satırının en sonunda "Click Here" yazan yere tıkladığınızda metodun özellikleri çıkacaktır. Bu kısımda "public" seçeneğini seçip dialog penceresini kapatıp, dll'imizi kaydediyoruz.

Tekrar dll'i test ettiğimz örnek uygulamamıza dll i eklediğimizde artık bu metodun da çağrılabildiğini göreceğiz.

 

Yine benzer şekilde TypeDef node'undan SecretObject'i seçip Flags kısmından sınıfımızı public olarak işaretleyip dll imizi kaydettikden sonra bu sınıfa da test projemizden erişilebildiğini görürüz.

Böylelikle bir dll in tüm özelliklerini değiştirirek kendimize özel hale getirip kullanabiliriz. Tabi ki iyi niyetle, tüm bu çabaların daha iyi uygulama geliştirme amaçlı olduğunu aklımızdan çıkarmadan değil mi ? :))))) Daha fazla bilgi için bu yararlı aracın sayfasından yararlanabilirsiniz.

Bir sonraki yazımda da yine iyi niyetli düşüncelerimizi gerçekleştirmek için neler yapabileceğimizi inceleyeceğiz.


 
Categories: .NET | Inceleme

Kod yazarken mouse kullanmayı sevmyenler için klavye kısa yolları önem kazanmaktadır( ayrıca kod yazmakda hız kazandırdığı da gayet açıktır) Hoşuma giden bir o kadar da az bilinen bazı kısayolları sizlerle paylaşmak istedim.

1- Kod yazarken birçok kez kopyalama işlemi yapıyoruz. Daha önce kopyalanan kodu,  2. kopyalama (ctrl + c) işleminden sonra kaybetmiyormuşuz :) yani vs arkaplanda kopyalanan kodları tutuyormuş. Ctrl + Shift + V ile bu kopyalanan kodlar arasında gezebiliyoruz.

Daha önceden kopyalanmış bir kodu yapıştırmak istediğimizde ctrl + shift +v tuş kombinasyonuna birden çok kez bastığımızda daha önceden kopyalanmış kodları da görebiliyoruz

2- Namespace'ini bilmediğimiz ya da o anda hatıryalamadığımız bir Type'in ismini doğru şekilde yazdığımızda type'in isminin hemen altında küçük kırmızı bir simge çıkararak, vs.net bize iki öneride bulunmaktadır. İster o anda direk namespace ismi ile kullanmayı, istenirse de using ifadesi ile kodun başına namespace'i eklemeyi önermekedir. Bu menüyü klavyeden elinizi kaldırmadan görebilmek için Ctrl + . tuş kombinasyonunu kullanabilirsiniz. (Teşekkürler Mustafa Güven :) )

 

3- Uzun metodlarda ya da sınıf tanımlamarında açılan ve kapanan küme parantezleri (braces) arasında dolaşmak için Ctrl + ] tuş kombinasyonunu kullanabilirsiniz.


 
Categories: .NET | Inceleme

Oluşturduğumuz assemblyleri Global Assembly Cache'e (GAC) yüklemek için gerek gacutil konsol uygulamasını gerekse de Control Panel\Administrative Tools altındaki Microsoft .NET Framework 2.0 Configuration aracını kullanarak manuel yükleme işlemini gerçekleştirebiliyoruz.

Peki bu işlemi yardımcı araçlar ile manuel olarak değil de bazı ihtiyaçlardan dolayı :) programatik olarak gerçekleştirmek isteyebilirsiniz. Reflector ile biraz .NET'i kurcaladığımda - eh! .net framework kendi içinde böyle bir desteği mutlaka sağlıyordur mantığından yola çıkarak - aşağıdaki resimden de görebileceğiniz GacUtil isimli bir sınıf ile karşılaştım.



Aşağıdaki basit bir reflection işlemi ile kendi assembly'imizi GAC'a yükleyebiliriz.

   1:  namespace BTAkademi.TestCodes
   2:  {
   3:      class Program
   4:      {
   5:          static void Main(string[] args)
   6:          {
   7:              //GAC'dan System.Web dll'i yükleniyor
   8:              Assembly asm = Assembly.Load(@"System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
   9:   
  10:              // Type bilgisi alınıyor
  11:              Type t = asm.GetType("System.Web.Configuration.GacUtil");
  12:              // Metodu invoke edebilmek için GacUtil türünden nesne oluşturuluyor
  13:              object o = Activator.CreateInstance(t);
  14:   
  15:              //Metod bilgisi alınıyor
  16:              MethodInfo mi = o.GetType().GetMethod("GacInstall");
  17:   
  18:              //metod çağrılıyor
  19:              mi.Invoke(o, new object[] { "C:\\gacTest.dll" });
  20:   
  21:          }
  22:      }
  23:  }


Not : GAC'a yüklenmek istenen assembly'nin public key token'a sahip olması gerekmektedir.

 

13/7/2008 tarihli düzenleme :

try
{
    System.EnterpriseServices.Internal.Publish gac = new System.EnterpriseServices.Internal.Publish();
    gac.GacInstall(yuklenecekassemblyadi);
}
catch (System.Security.SecurityException se)
{

}

şeklinde de yüklenebiliniyormuş :))) Eh azmetmek gibisi yok.


 
Categories: .NET | C# | Code | Inceleme

April 3, 2008
@ 01:07 AM
Microsoft Türkiye tarafından Visual C# kategorisinde Microsoft MVP ödülüne layık görüldüm. Beni bu ödüle layık gören ve destekleyenlere teşekkür ediyorum.


 
Categories: Yasam

Yazılım geliştirme sırasında  ya da bazı durumlara anlam vermek için kimi zamanda araştırma geliştirme işlemleri sırasında çeşitli araçlar düşüneceğimizden daha çok yardımıcı olabileceğini görüyoruz. Yeri geldiğinde gördüğüm hoşuma giden araçları sizlerle paylaştım.

Ama farkettim ki sıklıkla kullandığım 3 aracı sizlerle paylaşmamışım :)

-Fiddler
-LinqPad
-FireBug

Fiddler

Web Debugger olarak nitelendirebileceğimiz bu uygulama web geliştiricileri için olmazsa olmazlardandır diyebilirim.Bilgisayarınızdan herhangi bir yolla internet üzerinden bir yere eriştiğinizde ya da ie ile herhangi bir websitesine requestte bulunuduğunuzda ya da localinizde geliştirdiğiniz asp.net projelerinde Fiddler hemen devreye girerek tüm trafiği analiz eder ve size gösterir. HTTP protoklündeki tüm detayları size göstererek gerek keşleme olsun gerek sitenizin yüklenme süresi olsun gerek yüklenme sırasında tüm response ve requestlerin tüm detaylarına kadar izlemek olsun sayamayacağım bir çok özelliği ile yeri geldiğinde web uygulamarında karşımıza çıkacan sorunlara karşın can simidiniz olabilir.
http://www.fiddlertool.com/dl/Fiddler2Setup.exe linkinden bu aracı indirebilirsiniz.


Birkaç özelliğinden bahsedecek olursak TimeLine özelliği bir sitenin ne kadar sürede yüklendiği sitenin yüklenmesi sırasında hangi parçanın ne kadar zaman sürdüğü gibi bilgileri grafiksel olarak görebilirsiniz. Hiç tahmin etmediğiniz bir script dosyası ya da bir resim sitenin yüklenme süresini artırıyor olabilir.Bu sayede sorunlu içereği tespit etmek çok kolay olacaktır. (Resimlerin büyük hali için resmin üzerine tıklayınız)

Diğer önemli bir özellik ise, göndermiş olduğunuz Request'in ve size gelen Respons'un tüm ayrıntılarını gözlemleyerek arabelleğe alma (cache) gibi işlemleri ya da ajax işlemleri sırasında response detaylarını görebilir, buna göre istemci tarafli arabelleğe alma işlemlerinizi birkez daha gözden geçirebilirsiniz ;)

Diğer güzel bir özelliği ise sunucudan sıkıştırılmış (Gzip ya da deflate formatlarından birisi) olarak gönderilen içeriği çözerek (https istekleri ve sonuclarını da Fiddler ile incelemenizi tavsiye ederim ;) ) anlanlı şekilde gösterebiliyor. Google içeriğini Gzip ile sıkıltırarak istecilere gönderiyormuş meğersem ;)

Alernatif bir araç olarak HttpWatch'ı da inceleyebilirsiniz.
http://www.httpwatch.com/


LinqPad

Linq ile uğraşanlar için yardımcı bir araç olarak kullanılaiblir. En azından yazılan linq query'lerinin C# Expression karşılıklarının görülerek - ya da tam tersi - kod yazma becerinizin artmasını veya bazı durumlara anlam verebilmenizi sağlar. Bunların yanında herhangi bir geliştirme ortamına ihtiyac duymadan sorgularanızı yazabilir, sonuclarını güzel bir şekilde göstererek projenizi bozmadan testler yapabilirsiniz.Kurulum gerekmeden kullanabileceğiniz uygulamayı http://www.linqpad.net/ adresinden indirebilirsiniz.

 

FireBug

Özelliklerinin saymakla bitirilmeyeceği, kısaca HTML,CSS ve Javascript Debugger olarak nitelendirebileceğimiz bu FireFox eklentisi web geliştiricilerinin olmazsa olmazlarındandır.
http://www.getfirebug.com/ adresinden temin  edebileceğiniz bu eklenti ile herhangi bir site üzerinde istediğiniz değişiklikleri yaparak "acaba burası şöyle olsa idi, acaba şu tag'ın arka plan rengi şöyle olsa nasıl görünürdü, şimdi şu div'in class'ı şu değil de bu olsa sayfa ne hale gelirdi" gibi içinizdeki araştırma geliştirme ve test dürtülerinizi gerçekleştirmek için sonuna kadar imkan veren harika bir eklenti.

 

Eğer sizlerin de kullandığı yararlı araçlarınız varsa incelemek için sabırsızlanıyorum!


 
Categories: Inceleme

.net dünyasına ilk adım atanlardan sıkça duyduğum soruların başında "bu namespace'leri nerden bileceğim, bu class'ın var olduğunu nerden bileceğim, ya da hangi namespace içerisinde olduğunu nerden bileceğim" şeklinde sorular geliyor. Ben de "zamanla ve kullandıkça, ihtiyacınız oldukça" diye cevaplıyorum.

Şu ve şurdaki linklere dikkat edersek aslında .net framework'ün ne kadar geniş bir dünya olduğunu, hatta biraz abartırsak da "dibsiz bir kuyu" olduğunu da söyleyebilirim ;)

Gün geçmiyor ki yeni assembly'ler, yeni namespaceler ve type'larla karşılaşmayalım sayın programcılar :)


 
Categories: .NET | C# | Inceleme

Alper Hocam ile sık sık "yahu bu http'nin değişmesi lazım, browserların değişmesi lazım, geri kaldı birçok gelişmeye göre..." diye başlayan birçok sohbetimiz olmuştur. Ben de boş zamanlarımda "acaba değiştirsek neresinden nasıl başlardım?, dur bakalım şu HTTP'nin ince ne detayları varmış" diyerek HTTP'nin birçok detayını inceleme kararı almıştım. Araştırmalarım sırasında şu link biraz şaşırttı beni açıkcası.

Dökümanın dediğine göre bir resim dosyası base64 formatına çevrilip <img> tagına verildiğinde standartlara göre browserların bunu görüntülemesi gerekiyor ( bilin bakalım kim desteklemiyor olabilir ? ;) ). Küçük bir test kodu ile bunu denedim. Herhangi bir resim dosyasını base64 formatındaki bir string'e çeviren kod aşağıda.
 public string GetStringFromImage(string path)
{
return Convert.ToBase64String(File.ReadAllBytes(path));
}
Görüntülenmesi istediğim resim ise ;



HTML kodum ise aşağıda. Formata dikkat ederseniz - aslında şemaya -
data:[<mediatype>][;base64],<data>
şeklinde.

<img src="data:img/gif;base64,R0lGODlhYQAWAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/AP//AAAA//8A/wD//////
wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wD
MAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADN
mMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmY
AmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZAGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMm
WbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM
5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wzAMwzM8wzZswz
mcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz/
//8AAP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZ
v/Mmf/MzP/M////AP//M///Zv//mf//zP///ywAAAAAYQAWAAAI0gAfCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsmRDAAAoosy
48iTKlwNfykx5sGVMmhJtWtSp0CZPngZ/4owIdKTPoQ+K3tTZ8ijMpU+TyrwplWZUpUFxCu0ZVarXmla1hqVaVeDTpkgTztyKEC3UgmvNipVL9mj
dtG2HMsVL92tVvXP9op3ZV/BYlwT35o3r1W5fx0Udf8UKF3BivoonH9Ysd7Pbwp8ZrkWqNDNkwp0NXw3M2aTr17Bjy55Nu7bt2xQDAgA7" />

Eğer yukardaki şekilde değil de kod ile base64 string'ini direk <img> tagına atamak istiyorsanız aşağıdaki kod sorunu çözecektir.

<img src="data:img/gif;base64,<%Response.Write(Convert.ToBase64String( System.IO.File.ReadAllBytes("C:\\vs.gif"))); %>" />

Sonuç; ie7 - yamulmuyorsam -  desteklemez iken, Firefox bunu başarılı bir şekilde görüntülüyor.



Tabi bu yöntemle resim göstermek neye yarar, limitleri var mıdır, yok mudur tarzında sorularınız için şu linkden faydalanabilirsiniz.

 
Categories: Asp.net | Inceleme

Bilişim alanında güçlü bir beyin fırtınası estirmek ve fırtınadan öğrencilerin ve bölüm akademisyenlerinin azami derecede faydalanmasını sağlamak amacıyla 28-29 Şubat 2008'de, Bucak Hikmet Tolunay MYO Oğuzhan Kampusü'nde, "2.Bilişim Fırtınası" düzenlendi.

29 Şubat' günü sevgili Sefer Algan ile etkinlikte yer aldık. Açıkcası tam bir süprizler günüydü.Etkinlikte de bahsettiğim gibi gerçekten yürekten "Hoşbulduk" dedirtecek kadar misafirperver ve ilgili öğretim görevlileleri bizi karşılayarak Bucak'a gittik.

Gerek yerel halktan yazılıma gönül verenler, gerek universitenin öğrenciler, gerek öğretim görevlileri dinleyiciler arasındaydı. Ama bundan çok daha önemlisi ilçenin yazılım ile ilgili dersleri olan "lise"lerden de öğrenciler gelmişlerdi. Bu öğrencilerden bir kız "ben bir uygulama yapacağım ama web demi yapsam yoksa windows da mı karar veremedim?" sorusu vardı ki bu beni benden aldı diyebilirim.

Gerek gösterilen ilgi gerek gelen sorulardan katılımcıların yazılıma ne kadar gönül verdikleri ortadaydı. Belki büyük şehirde olmamız belki bilgi paylaşımının bol olduğu bir şehirde yaşıyor olmamızdan mıdır nedir tam anlamış değilim ama bizim gibi yazılımı sevip yazılım alanında ilerlemek isteyen Bucak'lı öğrencilerimizin bizler kadar bilgiye erişme fırsatı olmuyor. Bu yazılıma gösterilen ilgi karşısında inanın "yahu istanbul, ankara ... gibi illerde yapılan seminerlere katılmayan, ya da iş olsun diye katılan, ya da aman dinleneyim ne semineri şimdi" diyenler aklıma geliyor da susmakla yetinmek sanırım daha iyi olacak.

Öğrenciler için faydalı olmak adına elinde gelen tüm özveriyi gösteren ,Tekrardan Okul Müdür Sayın Doç. Dr. Hüseyin DALGAR'a ,Hasan MAZLUM'a, misafirperverliğinden ve ilgisinden dolayı İlker UNAL'a, Recep ÇOLAK'a, yemek tercihlerindeki önerileri ve bizi havaalanına son dakikada yetiştiren sevigili Şeref ÇALKAYA Hocam'a (Kusura bakmayın vedalaşamadık) ve ismini hatırlayamadığım Hoca'larıma teşekkür ediyorum.


 
Categories: Inceleme | Internet | Yasam

16 Şubatta Çankaya üniversitesinde daha önce iki kez Istanbulda düzenlemiş olduğumuz etkinliğimizi gerçekleştirdik. Tüm katılımcılara faydalı olduğumuzu umarım. Etkinliğin düzenlenmesinde başta İlker Acar olmak üzere, diğer MSP arkadaşlara teşekkür ederiz.

Not : Berk sana ayrıca teşekkür ederim ;) o güzel kahvaltı mekanı ile bizleri buluşturduğun için :)




 
Categories: .NET | Yasam

February 9, 2008
@ 11:59 PM

Linq To SQL de, bir nesne ( Personel ) yüklendiğinde ( from c in DB.Personels select c ) ilişkili olduğu ( Telefon ) tablodaki veriler ( Personele ait Telefonlar )
belleğe yüklenmezler. Aşağıdaki resime bakacak olursak ;




kisi nesnesine ait Ad özelliğinin değeri okunmak istendiğinde zaten bellekte olduğu için yeniden bir işlem yapılmamakta. Ama bu kisi nesnesine ait telefonlar - tablolar arasında ilişki olduğunu biliyoruz - Telefons isimli bir koleksiyon türünden özellik  ile ifade ediliyor. Bu kişiye ait telefon bilgilerinden ilkine erişmek istediğimizde kisi nesnesine ait telefon bilgilerini alıp nesneyle ilişkilendirmek için ikinci bir T-SQL sorgusu veritabanı sunucusuna gönderiliyor. Aslında performans açısından bakıldığında istenen durum budur.

Peki ama ben kisi nesnesini oluşturduğumda buna ait telefon bilgileri de - dikkat edin o kişiye ait adres bilgileri de olabilir ama biz sadece telefon bilgilerinin de - tamamen belleğe yüklensin ikinci bir select işlemi yapılmasın istersek. Bu durumda kodumuza  aşağıdaki gibi eklemeler yapmamız  gerekecektir.



Görüldüğü gibi DataLoadOptions sınıfı ile  nesnenin ilişkili olduğu verilerin de nesne ile birlikte belleğe yüklenmesini sağlayabiliyoruz.  LoadWith Generic metoduna tip olarak Kisi sınıfını verip, lambda Expression ile de Kisi türünden bir nesne yüklendiğinde buna ait telefon bilgilerinin de yüklenmesini ( c => c.Telefons ) belirtebiliyoruz (Immediately Load). DataContext nesnemizin de LoadOptions özelliğine değeri atayarak şekilde görüldüğü gibi iki ayrı select sorgusu ile istediğimiz senaryoyu gerçeklemiş olduk.

 
Categories: C# | Code | Inceleme

C# 3.0 ile birlikte gelen yeniliklerden, otomatik özellikler ile artık kolay ve hızlı bir biçimde standart özellikler (property) tanımlayabiliyoruz.

Örneğin;

class Person
{
   public int No { get; set; }
   public string Ad { get; set; }
   public FizikselOzellik Ozellik { get; set; }
}

class FizikselOzellik
{
   public int Kilo { get; set; }
   public int Boy { get; set; }
   public string Cinsiyet { get; set; }
}

gibi. Aslında IL kodlarını incelersek, derleyicinin C# 2.0 daki gibi (arka planda bir field oluşturup, get ve set erişimcilerini otomatik kendisi yazıyor) özellik tanımladığını görebiliriz. Yeni gelen diğer bir özellik ise Nesneye Ilk Değerini verme ile ilgili. Aşağıdaki sentaks ile artık nesneleri oluştururken özelliklerine de ilk değerlerini vererek nesneyi oluşturabiliriz.


Person nesnemiz içerisinde özellik olarak FizikselOzellik isimli başka bir nesne içeriyor. Bu durumda da aşağıdaki sentaks ile Person nesnemize ilk değerini verebiliriz.,

Person p = new Person {
               
Ad="oguz",No=169,
               Ozellik = new FizikselOzellik{Kilo=120,Boy=173,Cinsiyet="E"}
};

Görüldüğü gibi C# 3.0 ile gelen yenilikleri dili kullanmayı daha hızlı, zevkli ve kolay bir hale getiriyor ;)

 
Categories: C# | Code

February 8, 2008
@ 03:07 PM
İki tabloyu birlikte sorgulamak için inner join kullanırız. Bunu Linq To Sql ile yaparken aşağıdaki gibi bir Linq Query yazarak çözüyoruz
(Kisi, Telefon ve Adres tablolarımız olduğunu, bir kişinin de birden çok adresi ve telefonu olduğunu düşünüyoruz )
Bu sorgu sonucunda bana kişiler tablosundaki isimler ve bunlara ait telefon numaraları gelecektir.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID
select new
{
    Ad = kisi.Ad,
    Tlf = tlf.Numara
}

T-Sql çıktısı
SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
INNER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis.Join ( Telefons, kisi => kisi.ID, tlf => tlf.KisiID, (kisi, tlf) => new { Ad = kisi.Ad, Tlf = tlf.Numara } )



Senaryomuzu değiştirelim ;
Kişiler tablosundaki tüm kayıtlat gelsin, telefon numarası olmayanlar da gelsin telefonu yoksa null değer gelsin. Bunun içinde Left Outer Join ile çözeriz. Linq sorugumuzu şu şekilde değiştirmemiz yeterli olacaktır.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID into data
from x in data.DefaultIfEmpty()
select new
{
   Ad = kisi.Ad,
   Tlf = x.Numara
}

T-SQL çıktısı

SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
LEFT OUTER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis
.GroupJoin (
Telefons,
kisi => kisi.ID,
tlf => tlf.KisiID,
(kisi, data) =>
new
{
kisi = kisi,
data = data
}
)
.SelectMany (
temp0 => temp0.data.DefaultIfEmpty (),
(temp0, x) =>
new
{
Ad = temp0.kisi.Ad,
Tlf = x.Numara
}
)

 
 
Categories: C# | Code

February 8, 2008
@ 01:49 AM
Şu sıralar C# 3.0 ve LINQ ile ilgili  birçok dökümanda pek rastlamadığım bir anahtar kelimeyi (keyword) paylaşmak istedim.
Eğer LINQ ifadeleriniz içinde bir değişkene ihtiyacınız olursa - kimsenin ihtiyacı olmuyor da ondan mı kullanmıyor nedir ? ;) -
let ile tanımlayabiliriz  - bu let bir yerlerden tanıdık geliyor mu ne :)) -

Misal ;

string[] bolumler = { "matematik", "fizik", "kimya" };
Random r = new Random();

var sonuc = from c in new[]{ new {Ad="ali",Yas=21},
                                        new {Ad="murat",Yas=22},
                                        new {Ad="ismail",Yas=25}}

let bolum = bolumler[r.Next(0,bolumler.Length)]
select new
{
    Person = c,
    Bolum = bolum
};

foreach (var s in sonuc)
    listBox1.Items.Add(s.Person.Ad + " " + s.Bolum);




 
Categories: C# | Code

1.YOL Extension metodları ve lambda expression kullanarak

foreach (IGrouping<string, string> group in Directory.GetFiles(Path.GetTempPath()).GroupBy(file => Path.GetExtension(file)))
{
    listBox1.Items.Add("--- " + group.Key + " ---");
    foreach (string file in group)
    {
        listBox1.Items.Add(file);
    }
}

2.YOL LINQ Expression Kullanarak

var sonuc = from c in Directory.GetFiles(Path.GetTempPath())
                
group new
                        
{
                             DosyaAd = c
                         }
                 by Path.GetExtension(c);

foreach (var  group in sonuc)
{
    listBox1.Items.Add("--- "+group.Key+" ---");
    foreach (var s in group)
       
listBox1.Items.Add(s.DosyaAd);
}

3.YOL LINQ Expression Kullanarak (Tipler Biliniyor)

IEnumerable<IGrouping<string,string>> sonuc = from c in Directory.GetFiles(Path.GetTempPath())
                                                               
group c
                                                               
by Path.GetExtension(c);

foreach (IGrouping<string,string> group in sonuc)
{
   
listBox1.Items.Add(group.Key);
   
foreach (string file in group)
       
listBox1.Items.Add(file);
}


 
Categories: C# | Code

February 5, 2008
@ 11:22 AM
C# 3.0 dili ile birlikte gelen yeni özellikleri şimdiye kadar duymayan kalmadı denebilir. Gerek seminerler olsun gerekse Türkçe içerikli makalelerde bunlara değinildi.
Yeniliklerden birisi olan Lambda Expressionlar ile artık C# 3.0 bir "fonksiyonel programlama dilidir" diyebiliriz. İlerki zamanlarda bunlarla ilgili kod örneklerine de yer vereceğim.

Belirsiz Tiplerle (Anonymous Types) ilgili bir örnek kod olarak belirsiz tiplerden oluşan bir dizi nasıl oluştururuz buna bakalım.

	  var bilinmeyenTipdenDizi = new[] 
          {
              new {Ad="oguz",Soyad="yagmur"},
              new {Ad="sefer",Soyad="algan"},
          };

          foreach (var bilinmeyenTip in bilinmeyenTipdenDizi)
          {
              MessageBox.Show(bilinmeyenTip.Ad +" " + bilinmeyenTip.Soyad);
          }
Burda dikkat edilecek nokta dizinin bilinmeyen tipli elemanlarının aynı imzaya sahip olması. Nihayetinde bildiğimiz gibi belirsiz tiplerde IL de belirli bir tipe dönüştürülüyor ;)




 
Categories: C# | Code

January 30, 2008
@ 11:21 PM
Linq to Sql de veritabanı sunucusuna giden sorguları SQL Profiler ile izleriz. Fakat daha kolay bir yol var. Aşağıdaki resim gayet açıklayıcı ;)
Tek yapmamız gereken DataContext türünden nesnemizin Log özelliğine istediğimiz çıktıyı vermek olacaktır.



Eğer kodumuzu aşağıdaki gibi düzenlersek bu defa da üretilen T-SQL istediğimiz herhangi bir fiziksel dosyaya kaydedilecektir.

testDataContext db = new 
db.Log = new StreamWriter("C:\\l2s.log"); var v = from p in db.Persons where p.Surname == "asma" select p.Name; Text = v.First(); db.Log.Close();
l2s.log dosyasının içeriği aşağıdaki gibidir.

SELECT TOP (1) [t0].[Name]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Surname] = @p0
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [asma]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8

 
Categories: .NET | C# | Code | Inceleme

January 30, 2008
@ 12:04 AM
Birçoğuz biliyoruz ki, kimi zaman belirli bir classdan çalışma zamanında sadece tek bir nesne oluşturulmasını isteriz. Aynı sınıfa ait ikinci bir nesne oluşmasını engellemek isteriz. Bu durumda Singleton Tasarım Kalıbını (Alper Hoca'nın kulakları çınlasın)  uygularız. Fakat birçok class için bu durum geçerli ise her defasında bunu uygulamak bizim gibi üşengeç programcılar için can sıkıcı hal alır. Çözüm ise,
    
class GenericSingleton<T> where T : class, new()
{
    private static object lockObject = new object();
    private static T m_Instance;

    public static T GetInstance()
    {
        if( m_Instance != null)
            return m_Instance;
        lock ( lockObject)
        {
            if (m_Instance == null)
            {
                m_Instance = new T();
            }            
        }
        return m_Instance;
    }
}

Bu generics süper bişi! - ben bu lafı bir yerden hatırlıyorum ama -


 
Categories: C# | Code

C#nedir?com ekibi olarak çok güzel bir etkinliğin dah altına imzamızı atmış olduk.

Tüm arkadaşlarıma ve katılımcılara teşkkür ediyorum.

16 Şubatta Ankara'da görüşmek üzere.


  
 
Diğer tüm resimler için buyrun.

 
Categories: .NET | Internet

January 25, 2008
@ 03:49 PM
1999 'dan bu yana kullandığımız HTML 4 eklenen yeni özellikler ve değişen kavramları ile HTML 5 olarak karşımıza çıktı.
Kısa süre önce W3C tarafından duyrulan HTML 5 de dikkat çekici birçok yeni eklenmiş özellik mevcut.
Görsellik verme yönden birçok eksikliği olan HTML 4'ün - css ile kastıranlar bilir - getirilen yenilikler ile görsellik tarafı zenginleştirilmiş. Özellikle yeni gelen input kontrolleri ile - rakam girilebilen textbox, tarih girilebilen kontrol, sadece url ya da e-mail girilebilen kontrol - çok daha kolay bir şekilde formlarımızı tasarlayabiliriz.

İlgi çekici kontrollerden birisi de datagrid ve datalist kontrolleri. HTML API leri ile ilginç uygulamalar çıkarabileceğimizin işaretleri gibi ;)

En kısa sürede bu yenilikleri - HTML 5 - destekleyen tarayıcılara kavuşmak istiyoruz :) Ama daha da önemlisi tarayıcılardan ricamız html 5'i doğru bir şekilde yorumlamaları. Bıktık tarayıcıların farklı algılamalarından :)

 
Categories: Internet

Ekim ayında şu adresten .net kaynak kodlarının bir kısmının ilerde geliştiriciler için açılacağını duymuştuk. Geçen zaman sonunda ScottGu şu linteki güzel haberi bizlerle paylaştı. Kendisi bile mutlu olmuş bu haberi duyurmaktan ;)

Sadece VS.NET 2008 için geçerli olan bu işlem, debug yaparken aşağıdaki .net kütüphanelerinin kodlarını göreceğiz. Ençok da System.Threading,  System.Reflection, System.Windows.Forms kısımlarını merak ediyorum!

  • .NET Base Class Libraries (including System, System.CodeDom, System.Collections, System.ComponentModel, System.Diagnostics, System.Drawing, System.Globalization, System.IO, System.Net, System.Reflection, System.Runtime, System.Security, System.Text, System.Threading, etc).
  • ASP.NET (System.Web, System.Web.Extensions)
  • Windows Forms (System.Windows.Forms)
  • Windows Presentation Foundation (System.Windows)
  • ADO.NET and XML (System.Data and System.Xml)

En kısa zamanda C#nedir?com da konu ile ilgili bir video hazırlamaya çalışacağım.


 
Categories: .NET | Inceleme

January 20, 2008
@ 09:01 PM

İlk başlayanlar için zor sonrasında alışanlar için de sıkıcı gelen web.config dosyasını kolay birşekilde editleyeceğimiz güzel bir aracı sizlerle paylaşmak istedim. Kullanması çok kolay olan ASPhere çok güzel bir arayüz ile sıkıcı ve zor editleme işlemlerini eğlence haline getiriyor. Bakarsınız bilmediğimiz ayarları bile görebiliriz ;)

 


 
Categories: Asp.net

January 15, 2008
@ 08:47 PM

Değerli Arkadaşlar, biliyorsunuz bu ay sonunda Visual Studio.NET 2008 ve SQL Server 2008 in lansmanı yapılacak. SQL Server 2008 ile güzel bir yeniliği sizlerle paylaşmak istiyoruz. Veri tabanında BLOB (Binary Large Object) nesnelerini özellikle veritabanında dosya tutmak istediğimizde kullanıyoruz.  Özellikle iş akışı ve döküman yönetimi sistemlerinde veritabanında dosya tutmaya başladığımızda veritabanı gün geçtikçe dosya sistemi gibi büyümeye başlıyor, ve yedekleme işlemi işkenceye dönmeye başlıyordur. SQL Server 2008 dosya sistemi ve ilişkisel veritabanı sistemini kullanarak hibrid bir model sunuyor bizlere. Yani 2008 den itibaren artık BLOB işlemleri veritabanında bir kolon şeklinde tanımalanabilecek ancak istersek dosya içeriğini file system'de tutabileceğiz. Böylece ilişkisel veri modelinden vazgecmeden geniş binary içerkli dosyaları fiziksel olarak diskte saklayabileceğiz.  Veritabanı ise fiziksel dosya sistemine bir nevi referans gibi çalışacak. Bu işlem tamamen opsiyonel olacağı için eski mantıklada çalışmak mümkün olabilecek.


 
Categories: .NET | Code

December 11, 2007
@ 10:31 AM

Evet, birçoğumuz alışır olduk son zamanlarda Microsoft'un ürünü çıkarmadan önce kodadı ile bizlere tanıyor olmasına. Katmai, Orcas, Longhorn,Whidbey,Atlas vs vs..

Aslında şu linke bakıldığında hiç de küçümsenemeyecek kadar çok sayıda kodadları listesini görebilirsiniz.Örneğin Windows 95 'in kodadının Chicago,Windows 98'in Memphis, Microsoft Office Communicator 2005'in Istanbul  , Windows Mobile 5.0'ın Magneto imiş :)


 
Categories: Inceleme | Internet

C# 3.0'ın getirdiği güzel özelliklerden birisi olan İsimsiz Tipler'in bazı kısıtlamaları bulunmakta. Özellikle de metodlara parametre olarak geçirilme konusunda sıkıntı yaratıyor. Örneğin

static void Main(string[] args)
{
    var
v = new
    {
       
Ad = "oğuz",
        No = 44,
        Miktar = 122.2
    };
    BirDost(v);
}

şeklindeki bir tipi metoda parametre olarak geçirmek isteyelim.Amacımız bu tipin özelliklerindeki - property - değerleri almak ve işlem yapmak olsun.

public static void BirDost(var belirsizTip)
{
...
}

hmmm..işler düşündüğümüz gibi gitmeyecek ve derleyici şöyle bir  hata verecek.

Error 1 The contextual keyword 'var' may only appear within a local variable declaration

Tamam o zaman herşey object'tir mantığından yola çıkarak metodumuzu aşağıdaki gibi değiştirelim.

public static void BirDost(object belirsizTip)
{
 // belirsizTip. (???)
}

Tamam oldu gibi..Ama belirsizTip nesnesi üzerinden Ad,No,Miktar gibi özelliklere nasıl erişebilir ki? Seni seviyorum .NET diyerek biraz reflection uyguluyoruz ve sonuç.

public static void BirDost(object belirsizTip)
{
   
Type t = belirsizTip.GetType();
    PropertyInfo[] ps = t.GetProperties();

   
foreach (PropertyInfo p in ps)
    {
       
Console.WriteLine(p.Name + " => " + p.GetValue(belirsizTip,null));
    }
}

Artık isimsiz tiplerimizi gönül rahatlığı ile - çok mu duygusal oldu nedir? - metodlara parametre olarak aktarbiliriz ;)


 
Categories: C# | Code

November 26, 2007
@ 11:33 AM

C#nedir?com ekibi olarak çok güzel ve büyük bir etkinliğin daha gerçekleşmesi mutluluğu içerisindeyiz.
Tüm katılımcı arkadaşlarımıza çok teşekkür ediyorum kendi adıma.

</