Dr. Volkan Tunalı'nın Kişisel Blogu

Bilgisayar, Teknoloji, Bilim, Sanat

Archive for the ‘.net’ tag

Garbage Collector (Çöp Toplayıcı) Üzerine

one comment

Mesai arkadaşlarımızla özellikle de Delphi geçmişi olan arkadaşlarımızla .Net Framework’ünün önemli özelliklerinden biri olan Garbage Collector (GC / Çöp Toplayıcı) üzerine zaman zaman tartışmalar yapıyoruz. Tartışmalarda en çok, eskiden olduğu gibi Create-Free ikilisini .Net uygulamalarında da kullanmanın bir yararının olup olmayacağı sorusu gündeme geliyor. Devamında şu sorulara yanıt aranıyor;

  • GC ne kadar güvenilir?
  • Ne kadar sıklıkla temizlik yapıyor?
  • Sistemi çok meşgul etmiyor mu?
  • Bir sürü nesne yaratılıyor, form açılıyor, kapanıyor, bunların temizliğini GC’ye mi bırakacağız?

Üniversitedeyken Java’nın orijinal kütüphanelerinin kodlarını incelediğimde de mesela dizilerle ilgili statik metodlarda sıklıkla “bırakalım gerisini GC halletsin” şeklinde yorumlara rastlamış ve bunu derste hocamızla tartışmıştım. Tartışmamızın sonucunda Garbage Collector özelliği olan bir dil/sistem kullanıyorsak buna güvenmekten ve kodlarımızda bunun verdiği rahatlığı kullanmaktan daha doğal birşey olmayacağı sonucuna varmıştık.

Yani sonuç olarak .Net’in sunduğu Garbage Collector bizi managed olmak koşuluyla hafıza yönetimi ve kaynak geri dönüşümüyle ilgili her türlü sıkıntıdan kurtarıyor. Artık create-free çevrimine çok fazla takılmadan kodumuzun asıl yapacağı işe odaklanabiliriz.

Garbage Collector hakkında MSDN’de de bir miktar bilgi bulabilirsiniz.

—————————————–

Bu konu ile ilgili Tess Ferrandez’in MSDN’deki blog’unda bir quiz ve bu quiz’in cevapları var.

Bazıları biraz daha derine iniyor ama mesela ilk bakışta benim ilgimi çeken ve pratik olarak yararlı bulduğum bir tanesini buraya alıntılamak istiyorum.

12. Why is it important to close database connections and dispose of objects? Doesn’t the GC take care of that for me?

I think pretty much all of you got this one:) To paraphrase Arnaud, “The finalizer will eventually be called, after the object has been made available for garbage collection. Knowing that there may be quite some time until an object gets GC’ed, and that many resources are limited, you call Dispose yourself as soon as you’re over with an object. It doesn’t get GC’d when you call Dispose, but it releases its resources.”

Hızlıca bir çevirecek olursak;
Soru: İşimiz bittiğinde veritabanı bağlantılarını kapatmak ve ilgili nesneleri Dispose etmek neden önemlidir? GC bütün temizlik işini bizim yerimize zaten halletmiyor mu?
Cevap: İlgili nesne GC için uygun hale geldiğinde eninde sonunda GC tarafından temizlenecek. Ancak GC’nin bunu yapması için oldukça uzun bir zaman geçebilir. Veritabanı bağlantısı gibi kaynaklar sınırlı sayıda olduğunda Dispose çağrısı yaparak işimiz bittiğinde kaynakları elimizden çıkartmak gerekir. Şu da var ki Dispose çağrısı yaptığımızda GC tarafından hemen temizlik yapılmaz, sadece bize ayrılmış kaynaklar serbest bırakılır.

Sonuç olarak, IDisposable arabirimini destekleyen sınıflarda Dispose metoduyla temizlik yapmak –özellikle de veritabanı bağlantısı gibi nispeten daha sınırlı kaynaklar için– iyi bir alışkanlık gibi görünüyor. Zaten çoğumuz veritabanı bağlantısı ile ilgili olarak Dispose’un otomatik çağrılmasını sağlayan using bloğunu kullanıyoruzdur.

Written by vtunali

Eylül 24th, 2009 at 2:38 pm

.NET Uygulamalarını Ağ Üzerinden Çalıştırmak

leave a comment

Bildiğiniz gibi eğer bir .Net uygulamasını ağ üzerindeki bir paylaşımdan çalıştırmak isterseniz uygulama penceresinin üzerinde kocaman bir yazı beliriyor ve bu uygulamanın güvenli olmadığını söylüyor. Bu yazıyı görmezden gelip uygulama ile mesela bir dosyaya birşeyler kaydetmek istediğimizde ise uygulamanın bunu yapabilmek için yeterli izni olmadığına dair istisnalar oluşuyor.

Bu tür güvenlik vs. nedeniyle uygulamaların istemci makinelere güvenli ve sağlıklı bir şekilde yayılması (deploy edilmesi) amacıyla Microsoft ClickOnce ismiyle bir altyapı hazırlamış. ClickOnce ile uygulamalar daima istemci makinaya kuruluyor, her çalıştırıldığında güncel sürümü olup olmadığını kontrol ediyor, varsa kendini güncelliyor vs. Ancak bu tür uygulama yayılımı herkesin hoşuna gitmeyebiliyor. Güncel EXE’nin ve de çeşitli konfigürasyon dosyalarının müşterinin merkez sunucusunda bir arada bulunması yaklaşımı genel olarak daha basit ve daha “kontrol altında” bir yaklaşım olarak görünüyor. Belki de eski alışkanlıklarımızdan hemen vazgeçemeyişimiz de ClickOnce gibi yaklaşımları garipsememize neden oluyor.

Neyse, biz konumuza dönelim. ClickOnce kullanmadan, eski usülde EXE’miz ağ üzerinde bir paylaşımda bulunuyor. Ne yapacağız?

Ağ üzerindeki EXE’mizin tam yeri örneğin \\Sunucu2008\Program\Test.exe olsun.

Bu uygulamayı kullanacak TÜM istemci bilgisayarlarda şu komut çalıştırılmalı.

caspol.exe -q -m -ag 1.3. -url file://Sunucu2008\Program/* FullTrust

caspol.exe, Windows klasörü içindeki .Net 2.0 klasörü içinde yer alıyor. Tam yeri ise şöyle:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

Kısaca burada kullandığımız parametrelerden de bahsedeyim.

-q : Quiet (Sessiz) Ekrana birşey çıkartmadan

-m : Diğer parametrelerin Makine seviyesinde işlem göreceğini söylüyor (Kuruluş, Makine ve Kullanıcı olmak üzere 3 seviye var, biz Makine’yi kullanıyoruz)

-ag : AddCodeGroup. Makine seviyesinin altında yer alana Kod Grupları seviyesine bir güvenlik ilkesi ekleyeceğimizi belirtiyor.

1.3. : Bu da Grup seviyesi.

    1.1. My Computer
    1.2. Local Intranet
    1.3. Internet (bizim kullandığımız paylaşımlar Intranet olarak değil Internet olarak gördüğünden 1.3 veriyoruz)
    1.4. Restricted Zone
    1.5. Trusted Zone…. diye gidiyor…

-url : Bu da Üyelik seviyesi. Bunun değişik türleri var, bizim için URL yeterli ve en spesifik olanı. -url’den sonra bir boşluk ve file://… şeklinde tam path geliyor. Path’in sonunda /* diyerek bu path içerisindeki herşey demiş oluyoruz. Denerseniz göreceksiniz, bu klasör içerisinde başka klasörler varsa bu klasörler de bu izinlere dahil ediliyor.

FullTrust : En sondaki bu parametre de güven seviyesi. Bizim uygulamalarımız FullTrust gerektiriyor.

Written by vtunali

Mart 26th, 2008 at 12:23 pm

Mono Üzerinde .Net Konsol Uygulaması

leave a comment

ASP.NET’i şimdilik bir kenara bırakıp Windows Forms uygulamalarının Mono’da nasıl çalışacağını denemek istiyorum. Tabi Forms’dan önce bir konsol uygulaması denesek nasıl olur?

Şu adreste verilen örneği önce Visual Studio ile çalıştırıyorum. Basit bir Hello World uygulaması yerine Google’da sorgulama yapan ve ilk 5 sonucu döndüren bir uygulama deniyoruz.

Visual Studio ile derleme sonucunda oluşan dosyaları olduğu gibi Linux’a kopyalıyorum ve çalıştırıyorum. Linux’ta çalıştırmak için doğrudan Exe’nin adını yazmak yeterli değil. Şu komut satırını vermek gerekiyor:

mono monocon.exe

Burada monocon.exe benim Visual Studio’da oluşturduğum programın Exe dosyasının adı.

Sonuç aynı. Konsol uygulaması için bir sorun yaşamadım. Bakalım Win Forms uygulamaları için de durum bu kadar kolay mı… Gelecek denememi bunun üzerine yapacağım.

Deneme yaptığım .cs dosyasını buradan indirebilirsiniz.

Written by vtunali

Kasım 17th, 2007 at 10:49 am

Linux Üzerinde Mono ile ASP.NET [1]

leave a comment

Windows üzerinde yapmış olduğum çalışmayı bir kez de Linux üzerinde yapmayı deniyorum. Bakalım burada neler yaşayacağım. Denemek isteyenler için olabildiğince açık bir şekilde, adım adım neler yaptığımı ekran görüntüleri eşliğinde yazmaya çalışacağım.

Öncelikle, Linux için bir kurulum dosyasına ihtiyacımız var; bunu http://www.mono-project.com/Downloads sayfasında yer alan kendimize uygun bir yöntemle yapabiliriz. Ancak Linux’çu (!) arkadaşlar benim gibi Windows temelli arkadaşları ihmal etmemişler ve güzel bir kurulum programı hazırlamışlar. Ben Linux Installer for x86 bölümünde yer alan Mono 1.2.5.1_2 Installer dosyasını indirip kullandım (sitede bu yazıyı hazırladığım sırada yeni bir dosyaya bağlantı verilmiş durumda olduğunu görüyorum). Bu dosyanın nasıl kullanılacağı da hemen yandaki Instructions to use the Installer sayfasında açıklanmış. Ben de aynı şekilde yaptım. An itibariyle o sayfada açıklanan kurulumun sürümü farklı, bu nedenle farklı bir MD5SUM sonucu çıkıyor, buna aldırmadan devam edin. Evet, resimlere başlayalım artık…

Microsoft Virtual PC 2007 üzerinde çalıştırdığım bir Pardus 2007 işletim sistemli sanal makinam vardı. Tüm çalışmamı bu sanal makinada yaptım. Daha önce bu Pardus’a herhangi birşey kurmamıştım, bunu da belirteyim. İlgili kurulum dosyasını kullanıcımın “home” klasörüne indirdim. Daha sonra konsol penceresi içerisinde aşağıda görülen komutları çalıştırdım.

chmod +x mono___installer.bin ./mono___installer.bin
./mono-1.2.5.1_2-installer.bin --mode xwindow

Grafik kurulumla ilgili sorun yaşayanlar için text mode kurulum için şu komutun kullanılması öneriliyor.
./mono-1.2.5.1_2-installer.bin --mode text

Daha sonra zaten Windows’dan alışkın olduğumuz bir kurulum programı başlıyor. Buradan itibaren ben varsayılan seçenekleri hiç değiştirmeden kurulum ekranlarında ilerledim.

Kurulum bitince bir uyarı penceresi çıktı. Bazı grafik kütüphanelerinin sistemimde olmadığını, bunları yüklemediğim taktirde bazı grafik uygulamalarını çalıştıramayacağımı söylüyor bu uyarı. Bunu önemsemiyorum…

Buraya kadar herşey güzel. Görünüşe göre sorunsuz bir kurulum gerçekleşti. Windows’da denediğim xsp web sunucusunu burada da denemek istiyorum. Bunun için Windows’daki kadar kolay bir yol bulamadım. Ben de komut satırından gereken parametrelerle xsp’yi çalıştırdım.

“home” dizinindeyken sırasıyla şu komutları çalıştırdım.

cd mono-1.2.5.1
cd lib
cd mono
cd 2.0
xsp2 --root /home/volkan/mono-1.2.5.1/lib/xsp/test

Ardından, xsp’nin 8080 portunda ve belirttiğim dizini sunucunun root dizini kabul ederek çalışmaya başladığını görüyorum. Peki, gerçekten çalışıyor mu? Hemen Mozilla’da deneyip görelim…

Evet, mono kurulumuyla beraber gelen test uygulaması gayet güzel çalışıyor. Geçen seferki gibi yine gerçek hayatta kullandığım bir ASP.NET uygulamasını hiç bir değişiklik yapmadan, aynen Linux’a kopyaladım ve çalıştırdım. Sonuç biraz hüsran gibi olsa da aslında güzel.

Galiba .aspx dosyasında yer alan “asp” etiketli nesnelerin renk ifadelerinde kabul görmeyen birşeyler var.

Tamam, peki “asp” etiketli nesne içermeyen basit bir .aspx dosyasını deneyelim, hiç olmazsa onda sorun var mı görelim. Bu dosyada tek sorun geçenki denememizden hatırladığım Türkçe karakter sorunu… Bunun dışında gayet güzel.

xsp’yi deneyebildim. Daha önce Windows üzerinde çalışan Visual Studio kullanarak geliştirdiğim bir ASP.NET uygulamasını hiçbir değişiklik yapmadan Linux üzerinde, mono üzerinde çalıştırmayı denemiş oldum. Bir dahaki sefere “asp” etiketli nesneleri daha basit olacak şekilde bir sayfa hazırlayıp bir adım daha ileri giderek veritabanı bağlantısı kurmayı deneyeceğim.

Written by vtunali

Kasım 6th, 2007 at 4:03 pm

Windows Üzerinde ilk Mono Denemem

leave a comment

.Net ortamında C# kullanarak ASP.NET uygulamaları geliştirmişliğim vardı. Ancak bunları hiç Linux ortamında çalıştırmayı deneme ihtiyacı duymamıştım. Şirkette son günlerde gündeme gelen Linux üzerinde de çalışacak yeni bir geliştirme aracı/ortamı arayışı üzerine Mono’yu kurcalamaya karar verdim (Java, php, vb. araçlardan önce bildiğimiz bir ortam olan Visual Studio’ya ilk etapta öncelik veriyoruz).

Öncelikle www.mono-project.com adresinden Windows üzerinde çalışan sürümünü indirdim. Linux’u daha sonra deneyeceğim. Öncelikle minimumda ihtiyaç duyacağımız kütüphanelerin Mono tarafından ne kadar desteklendiğini görmek istiyorum. Sonrasında deneylerimi Linux üzerinde sürdüreceğim.

İndirdiğim kurulum dosyasını yükledim. Kurulum sonrası gelen menü şu şekilde:

Bu menüden XSP 2.0 Test Web Server seçeneğini seçerek test sunucusunu çalıştırdım. DOS penceresinde sunucu çalışmaya başladı. Varsayılan olarak 8088 portunda dinlemede bekliyor.

Görelim bakalım gerçekten çalışıyor mu?

Evet, görünüşe göre D:\Program Files\Mono-1.2.5.2\lib\xsp\test klasörünü sunucunun kök dizini kabul ederek buradaki .Net uygulaması sağlıklı çalışıyor. Peki buraya daha önce Visual Studio’da geliştirdiğimiz bir uygulamayı olduğu gibi koysak çalışacak mı?

Daha önce bir hosting firması için geliştirdiğim bir uygulamanın eski bir sürümünü deneme amaçlı kullandım. Ana sayfa Türkçe Karakter sorunu içererek açıldı. İlginç bir durum var, .aspx dosyasında yer alan Türkçe karakterli metinler bozuk görünürken .cs dosyalarından yani derlenmiş koddan gösterilen mesajdaki Türkçe karakterler bozuk değil! Yazı tipi sorunu da değil buradaki. Bu arada belirteyim, projedeki tüm dosyalar UTF-8 kodlamasına sahip.

Türkçe karakter sorununu bir kenara bırakıp SQL Server bağlantısı yapabiliyor muyuz bir bakalım…

Fakat o da ne, “Keyword not supported UİD“. Fakat ben ConnectionString içinde büyük harflerle “UİD” kullanmadım ki, “uid” olarak kullandım. Web.config dosyasında sakladığım ConnectionString içindeki bütün küçük “i”leri büyük “I”ya çevirerek tekrar deniyorum.

Veritabanı bağlantısını başardık ve veritabanından kayıtları listeledik. Tekrar belirteyim, kodla dinamik olarak oluşturduğumuz bütün Türkçe karakterli String ifadeler düzgün görünürken .aspx’teki statik metinler Türkçe karakter sorunu yaşıyor. Belki de şu an için bilmediğim bir ayarlama gerekiyordur. İlerleyen günlerde çözerim umarım.

Windows üzerindeki deneyime şimdilik ara veriyorum. En azından beklentimi karşıladı gibi ama tabi ki sonuçta burada .NET Framework 2.0 kurulu bir Windows üzerindeyiz. Linux’ta başımıza neler gelecek merak ediyorum.

Written by vtunali

Kasım 3rd, 2007 at 12:25 pm