Home Contact RSS

Archive for May, 2008

Mobile development blog

Kivanc Ozuolmez is an another Turkish MVP who blogs in English. If you are interested in mobile technologies and mobile development, don’t forget to subscribe to his blog to catch the latest news and stuff about mobile technologies.

http://www.kvnc.net/

Recent News

Microsoft MVP Global Summit was amazing this year. New contacts and friends, latest news about incoming Microsoft products, a lot of know-how. Everything was amazing. Here is a picture of mine taken by Cenk CAGLAR in Microsoft Corporate Campus, Seattle.

DSC01274

On the other hand, I have been re-awarded the Microsoft MVP award for the 3rd time. I would like to thank the Microsoft MVP Team both at Microsoft and at Microsoft Turkey for the opportunities that they have been providing for last 2 years. It is great pleasure to work together with them.

Further more, I have been in Istanbul for a long time for some reasons. Finally, I am back in Propeople Sofia office since April 28.

Makale 14: Remoting Uygulamalarının “Performance Counter”lar ile İzlenmesi

.NET içerisinde bulundurduÄŸu hazır class’lar sayesinde uygulamanızın Windows Performans Monitor ile son derece kolay bir ÅŸekilde etkileÅŸim kurabilmesini saÄŸlamaktadır.

Performans Monitor, Control Panel içerisinde bulunan “Administrative Tools” klasörü içinde “Performance” isimli shortcut’a tıklayarak ulaşılır ve ilk açıldığında aÅŸağıdaki görüntüye sahiptir.

Performans Monitor üzerinde yeni bir monitör ekranı açmak istendiÄŸinde “New Counter Set” butonuna tıklanır.

Yeni counter set’inde hiçbir counter bulunmaz. Bu boÅŸ counter set’ine yeni performance counter’ları eklemek için “Add” butonuna tıklanır.

Açılan ekranda “Performance object” seçeneÄŸi ile ne tip bir performance counter ekleneceÄŸi seçilir. .NET ile ilgili performance object’leri ekran görüntüsünde de görüldüğü gibi ÅŸu ÅŸekildedir:

Add Counters ekranında “Explain” butonuna tıklanarak performance counter hakkında detaylı bilgi alınır:

Instance seçim bölümünde uygulama seçilerek “Add” butonuna tıklanır:

Performance counter eklendikten sonra “Add Counters” ekranı baÅŸka performance counter’ların ekleneceÄŸi düşünülere kapatılmaz. Kapatılmak istendiÄŸinde “Close” butonuna tıklanır. “Close” butonuna tıklandıktan sonra geri dönülen ekranda bulunan performance counter listesinde eklenmiÅŸ olan counter bulunur.

Bu iÅŸlemleri yaptıktan sonra seçmiÅŸ olunan uygulamaya baÄŸlanacak olan Remoting client’ı run edilir ve ekrandaki deÄŸerler gözlemlenir.

Uygulama tekrar çalıştırıldığında değerler kaldığı yerden tekrar artacaktır.

.NET Framework’ün System.Diagnostics namespace’i altında bulunan PerformanceCounter class’ı Performance Monitor uygulamasının ekranda grafiksel olarak gösterdiÄŸi bilgilere, uygulamanın programmatic olarak eriÅŸebilmesini saÄŸlar. Bu sayede yazılımcılar kendilerine özel performance monitor uygulamaları geliÅŸtirebilirler ve ihtiyaçlarına özel raporlar oluÅŸturabilirler.

Daha önceden geliÅŸtirmiÅŸ olduÄŸumuz MyFirstRemotingService project’i içerisinde bulunan MyRemotableType class’ını aÅŸağıdaki ÅŸekilde deÄŸiÅŸtirerek, uygulamanın RequestCount method’u içerisinde PerformanceCounter class’ını kullanarak aldığı bilgiyi döndürmesini saÄŸlayabiliriz.

MyRemotableType.cs

using System;
using MyFirstRemotableType;
using System.Diagnostics;
namespace MyFirstWindowsService
{
    public class MyRemotableType : MarshalByRefObject, IMyRemotableType
    {
        PerformanceCounter perfCounter;

        public MyRemotableType()
        {
            perfCounter = new PerformanceCounter();
            perfCounter.CategoryName = ".NET CLR Remoting";
            perfCounter.CounterName = "Total Remote Calls";
            perfCounter.InstanceName = "MyFirstWindowsService";
            perfCounter.MachineName = Environment.MachineName;
        }

        public DateTime GetServerDateTime()
        {
            return System.DateTime.Now;
        }

        public int RequestCount()
        {
            return Convert.ToInt32(perfCounter.NextValue());
        }
    }
}

PerformansCounter class’ının CategoryName özelliÄŸi Performance Monitor uygulamasına counter eklerken seçtiÄŸimiz “Performance object” seçeneÄŸine denk gelmektedir. Bu özelliÄŸe “Add Counters” ekranında görmüş olduÄŸunuz herhangi bir deÄŸeri string olarak atayabilirsiniz.

PerformansCounter class’ının CounterName özelliÄŸi “Add Counters” ekranındaki “Counter” seçeneÄŸine denk gelmektedir. Bu özelliÄŸe “Add Counters” ekranında, “Counters” bölümünde görmüş olduÄŸunuz herhangi bir deÄŸeri string olarak atayabilirsiniz.

PerformansCounter class’ının InstanceName özelliÄŸi “Add Counters” ekranındaki “Instance” seçeneÄŸine denk gelmektedir ve instance listesinde bulunan uygulamalardan hangilerinin bu counter ile ölçüleceÄŸini belirlemek için kullanılır. Bu özelliÄŸe “Add Counters” ekranında, “Instances” bölümünde görmüş olduÄŸunuz herhangi bir deÄŸeri string olarak atayabilirsiniz.

PerformansCounter class’ının MachineName özelliÄŸi Performance Monitor uygulamasına counter eklerken seçtiÄŸimiz “Counter” seçeneÄŸine denk gelmektedir. System namespace’inde bulunan Environment class’ının sahip olduÄŸu static access-modifier’ına sahip MachineName özelliÄŸi uygulamanın üzerinde çalıştığı bilgisayarın ismini verdiÄŸinden, sabit deÄŸer verilmek istenmemesi durumunda bu özelliÄŸin atanması mümkündür.

PerformansCounter class’ının NextValue method’u counter’ın üzerinde gerekli hesaplamaları yaparak hesaplanan deÄŸeri geri döndürür.

Makale 13: Remoting Uygulamalarında Hata Ayıklanması ve Dağıtım

GiriÅŸ

“Uygulama çok yavaÅŸ çalışıyor!” cümlesi bir developer’ın en son duymak isteyeceÄŸi cümledir. Bir ÅŸekilde duyduysak da artık uykusuz gecelere hoÅŸgeldin demenin vakti gelmiÅŸ demek oluyor.

Fakat uykusuz gecelerin sebebi sanıldığı gibi yavaÅŸlıkların sebebinin bulunması deÄŸil, optimizasyonların yazılması. Peki nasıl oluyor da yavaÅŸlıkların ve performans kayıplarının bulunması bu kadar olabiliyor diye düşünenler için cevap çok net, Windows’un sunmuÅŸ olduÄŸu “Performance Monitor”.

Uygulamalar bazen sadece yoÄŸun olarak çalıştıkları durumlarda, örneÄŸin 10 kullanıcının aynı anda baÄŸlı olması, çeÅŸitli sorunlar çıkartabilirler. Bu durumda uygulamayı debug edebilmek için tek ÅŸansınız çalışır halde, uygulamanın client’lara sunduÄŸu servisleri aksatmadan duruma müdahale etmektir. Remoting uygulamalarının debugging iÅŸlemi bu sebeplerden dolayı çeÅŸitli sorunlara neden olabilmektedir. Fakat uygun condition’lar oluÅŸturulduÄŸunda bu sorun rahatlıkla aşılabilmektedir.

Remoting’in getirmiÅŸ olduÄŸu en önemli avantajın farklı environment’lar kullanılarak host edilebileceÄŸi olduÄŸundan bahsetmiÅŸtik. ÖrneÄŸin ASP.NET uygulamaları, Console Application’lar ve ya NT Service’leri. Tüm bu opsiyonları karşılaÅŸtırarak en uygun seçeneÄŸi bulmanız gerçekten önemli bir konu.

Bu chapter sonunda aşağıdaki konular hakkında bilgi sahibi olacağız;

  • Performance Monitor’ü kullanımı,
  • Remoting uygulamalarının debug edilmesi,
  • Remoting server’ının host edilmesi.

Host and Deploy a Remoting Application

.NET Framework remoting uygulamarının aşağıdaki seçenekler üzerinde host edilmesine imkan tanır.

  • IIS
  • Windows Service (NT Service)
  • Windows Application
  • Console Application

IIS

Host seçeneÄŸinin Internet Information Services (IIS) olarak yapılması IIS’in kendi içerisinde bulunan güvenlik seçeneklerinin (SSL, certificates, etc.) uygulamaya herhangi bir ek kodlama gerektirmeden eklenebilmesini saÄŸladığı için avantajlıdır. IIS seçeneÄŸi seçildiÄŸinde channel’ın üzerinde çalışacağı protocol yalnızca HTTP olabilir.

Windows Service

Hata oluşması durumunda Windows servislerinin sahip olduğu otomatik tekrar başlama özelliği sayesinde çeşitli hataların oluşması durumlarına karşı en avantajlı seçenektir. Uygun ayarların yapılması durumunda sistemin başlaması sonrasında, herhangi bir kullanıcının logon olmasına gerek olmadan, otomatik olarak çalışma özelliğine sahiptir.

Windows Service’leri System.ServiceProcess.ServiceBase class’ından inherit edilerek yazılmaları gerekmektedir. OnStart ve OnStop method’larının override edilmesi durumunda servisin baÅŸlatılmasında ve durdurulmasında yapılacak olan iÅŸlemler kolaylıkla develop edilebilir.

Windows Application

Uygulamanın çeÅŸitli parametrelere göre test edilmesi gibi durumlar sözkonusu olduÄŸunda sunduÄŸu görsel arabirim çeÅŸitli avantajlar getirebilmektedir. Uygulamanın kapanmasına sebep olacak bir exception throw edilmesi durumunda otomatik tekrar baÅŸlama ÅŸansı olmadığı için production environment’ta kullanılmamalıdırlar. Fakat Windows Application’ları genellikle Remoting server yerine Remoting client development’ında kullanılırlar.

Console Application

Test aÅŸamalarında kolay olarak çalıştırılabilmesi ve kolay debug edilebilmesi sebebiyle kullanılabilir. Remoting server’ları genel olarak bu uygulama tipinde develop edildikten sonra Windows Service uygulaması haline convert edilirler.

Örnek Windows Service Uygulaması

1.     Visual Studio’yu çalıştırın.

2.     File > New menüleri altındaki Project seçeneğini seçin.

3.     Visual C# > Windows seçeneği altındaki Windows Service proje tipini seçin.

4.     Name property’sine MyFirstWindowsService yazın.

5.     Location property’sine projeyi oluÅŸturmak istediÄŸiniz klasörün path’ini yazın ve ya Browse seçeneÄŸini kullanarak path’i gösterin.

6.     Solution Name property’si otomatik olarak MyFirstWindowsService ÅŸeklinde deÄŸiÅŸir, eÄŸer deÄŸiÅŸmemiÅŸ ise bu property’ye de MyFirstWindowsService yazın.

Bu işlemler sonrasında New Project ekranı aşağıdaki şekilde görünür:

NOT

Location property’sinde yazmakta olan “C:\Path\to\Your\Project” path’i seçmiÅŸ olduÄŸunuz path’e göre deÄŸiÅŸiklik gösterektir.

7.     OK butonuna tıklayın.

8.     Karşınıza “Service1.cs” isimli bir dosya açık olacak çıkar.

9.     Bu dosyanın ismini Solution Explorer penceresi yardımı ile “MyFirstService.cs” olarak deÄŸiÅŸtirin.

10.  Visual Studio “Service1.cs” dosyasının ismini deÄŸiÅŸtirdikten sonra bu dosya içerisindeki “Service1″ isimli class’ın ismi otomatik olarak “MyFirstService” ÅŸeklinde deÄŸiÅŸir. DeÄŸiÅŸmemesi durumunda class’ın ismini “MyFirstService” olarak deÄŸiÅŸtirin.

11.  Solution Explorer penceresindeki References klasörüne saÄŸ tıklayarak “Add Reference” seçeneÄŸine tıklayın.

12.  Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “.NET” tab’ındaki “System.Runtime.Remoting” assembly’sini seçin ve OK butonuna tıklayın.

13.  Solution Explorer penceresindeki References klasörüne saÄŸ tıklayarak “Add Reference” seçeneÄŸine tıklayın.

14.  Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “Browse” tab’ını seçerek “MyFirstRemotableType” project’inin bulunduÄŸu klasöre gidin.

15.  Bu klasör içerisinde de sırasıyla “bin” ve “Debug” klasörlerine girerek “MyFirstRemotableType.dll” isimli assembly’yi seçin ve OK butonuna tıklayın.

16.  Project’e MyRemotableType.cs isminde yeni bir Class dosyası ekleyin.

17.  MyRemotableType.cs dosyasının içeriÄŸini daha önce develop etmiÅŸ olduÄŸumuz MyFirstRemotingServer projesindeki ile aynı fakat tek farkı namespace bilgisi “MyFirstWindowsService” olarak, aÅŸağıdaki ÅŸekilde yazın:

MyFirstService.cs dosyasına import edilecek namespace’lerin import ediliÅŸleri

using System;
using MyFirstRemotableType;
namespace MyFirstWindowsService
{
    public class MyRemotableType : MarshalByRefObject, IMyRemotableType
    {
        int requestCount;

        public MyRemotableType()
        {
            this.requestCount = 0;
        }

        public DateTime GetServerDateTime()
        {
            requestCount++;
            return System.DateTime.Now;
        }

        public int RequestCount()
        {
            return requestCount;
        }
    }
}

18.  MyFirstService.cs isimli dosyaya saÄŸ tıklayarak “View Code” seçeneÄŸine tıklayın. Karşınıza servisin kodları çıkar.

19.  MyFirstService.cs dosyası içerisinde aÅŸağıdaki namespace’leri import edin:

MyFirstService.cs dosyasına import edilecek namespace’lerin import ediliÅŸleri

using System;
using System.Collections;
using System.ServiceProcess;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using MyFirstRemotableType;

20.  OnStart method’unu aÅŸağıdaki ÅŸekilde yazın:

OnStart method’u implementation’ı

protected override void OnStart(string[] args)
{
    IDictionary channelProperties = new Hashtable();
    channelProperties.Add("name", "MyTcpChannelName");
    channelProperties.Add("port", "4444");
    channelProperties.Add("priority", "1");

    TcpChannel tcpChannel = new TcpChannel(channelProperties, new BinaryClientFormatterSinkProvider(), new BinaryServerFormatterSinkProvider());

    ChannelServices.RegisterChannel(tcpChannel, false);

    RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemotableType), "MyRemotableType.rem", WellKnownObjectMode.Singleton);
}

21.  OnStop method’u içeriÄŸinde herhangi bir deÄŸiÅŸiklik gerekmemektedir.

22.  MyFirstService.cs dosyasına saÄŸ tıklayarak “View Designer” seçeneÄŸine tıklayın.

23.  Karşınıza gelen ekranda saÄŸ tıklayarak “Add Installer” seçeneÄŸine tıklayın.

24.  Ekranda iki yeni object belirir.

25.  serviceProcessInstaller1 ismindeki object’in type’ı System.ServiceProcess.ServiceProcessInstaller class’ıdır ve Account özelliÄŸi sayesinde servisin hangi user account’unu kullanarak çalıştırılacağı belirlenebilir. Bu özellikler User, LocalService, LocalSystem ve ya NetworkService seçeneklerinden birisi olabilir.

26.  serviceInstaller1 ismindeki object’in type’ı System.ServiceProcess.ServiceInstaller class’ıdır ve servisin Description, DisplayName, StartType, ServiceName gibi özelliklerine sahiptir.

27.  serviceProcessInstaller1 object’inin Account özelliÄŸini “LocalService” olarak deÄŸiÅŸtirin.

28.  serviceInstaller1 object’inin Description özelliÄŸini “This service hosts my first remoting server” olarak deÄŸiÅŸtirin.

29.  serviceInstaller1 object’inin DisplayName özelliÄŸini “My First Remoting Server” olarak deÄŸiÅŸtirin.

30.  serviceInstaller1 object’inin StartType özelliÄŸini “Automatic” olarak deÄŸiÅŸtirin.

31.  serviceInstaller1 object’inin ServiceName özelliÄŸini “MyFirstRemotingServer” olarak deÄŸiÅŸtirin.

32.  Project’i “Build” menüsünü kullanarak build edin.

33.  Visual Studio’yu kapatın.

34.  Visual Studio 2005 Command Prompt’u açın.

35.  InstallUtil.exe C:\Path\to\Your\Project\bin\Debug\MyFirstWindowsService.exe komutunu yazarak çalıştırın.

NOT

1.    InstallUtil.exe uygulaması Windows Service’lerinin kurulması iÅŸlemini gerçekleÅŸtirmektedir.

2.    InstallUtil.exe -u parametresi ile kullanıldığında servisi uninstall etmektedir.

3.    Komut içerisinde verilen C:\Path\to\Your\Project path’i project’inizi oluÅŸturduÄŸunuz klasöre uygun olarak deÄŸiÅŸtirilmelidir.

36.  Komut çalıştırıldığında karşınıza servisin hangi user account’unu kullanarak çalıştırılmak istendiÄŸi sorusu sorulacaktır. Buraya uygun bilgileri girin.

37.  Bilgileri girip OK butonuna tıklayın.

38.  BaÅŸarılı bir kurulum sonrasında command prompt ÅŸu mesajı gösterecektir: “The Commit phase completed successfully. The transacted install has completed.

39.  Control Panel’e gidin.

40.  Administrative Tools klasörüne girin.

41.  Services shortcut’ına çift tıklayın.

42.  Service listesi içerisinde My First Remoting Server isimli service’in yer aldığını göreceksiniz.

43.  Service’i çalıştırmak için saÄŸ tıklayın ve Start seçeneÄŸine tıklayın.

44.  Service başlatılacaktır.

45.  MyFirstRemotingClient isimli console application’ını çalıştırın ve bu iÅŸlem sırasında MyFirstRemotingServer isimli console application’ının çalışmadığından emin olun. Bunun sebebi her iki uygulamanın da 4444. portu kullanıyor olması ve ikisinin aynı anda çalışamayacak olmasıdır.

46.  MyFirstRemotingServer uygulaması çalışmıyor olduÄŸu halde Remoting client’ı çalışacaktır.

47.  My First Remoting Server isimli service’i stop edin.

48.  MyFirstRemotingClient isimli console application’ını tekrar çalıştırın.

49.  Windows servisini durdurduÄŸumuz durumda MyFirstRemotingClient isimli console application’ının çalışmadığını gördünüz.