Aug 26 2011

ASP.NET Membership, Roles, Forms Authentication–Part II ASP.NET Membership Visual Studio Web.config Settings

Merhaba, bügün sizinle önceden başlamış olduğumuz ASP.NET Membership teknolojisinin Web Formlar üzerinde nasıl kullanılacağına dair örnek yapacağım. Bu makalemin ilk kısmında, sizinle ASP.NET Membership teknolojisini kullanabilmek için gerekli SQL Server ayarlarını yapmıştık. ( ASP.NET Membership Part I ). Çalışmamıza başlayabilmek için Visual Studio’da yeni bir Web Application oluşturalım. Oluşturduğumuz Web Application’da sizinde tahmin ettiğiniz üzere ASP.NET Membership’I kullanabilmek için bazı ayarlar yapmamız gerekiyor. ASP.NET’de ayar denince akla gelen ilk isim olan Web.config dosyası burda bizim için yine kilit dosyadır. Web.config dosyası XML tabanlı bir dosyadır, ve uygulamamıza dair yapılandırma kodlarını barındırır. Bu dosya son derece güvenlidir, cünkü .config uzantılı olan bu dosya User tarafından yapılan Request’e cevap vermez, yani kullanıcı tarafından çağrılamaz. ASP.NET Membership için hazırlamış olduğumuz SQL Server Connection bilgilerini de Web.config içerisinde tutacağız. O halde Web.config dosyayı içerisine Connection String’I yazmaya başlayalım.

 

<connectionStrings>
    <add name="AspNetMembershipSample"
         connectionString="Data Source=.;Initial Catalog=AspNetMembership;Integrated Security=True"
         providerName="System.Data.SqlClient"/>
</connectionStrings>

 

Yukarıda görmüş olduğunuz gibi Connection String’I Web.config’in appsettings tag’I içine ekledim. Şimdi asıl önemli olan noktaya geldik. Sırada ASP.NET Membership ayarlarını yazmak var. Bunun için tabii ki yine Web.config dosyamızı kullanıcaz. Yazmamız gereken kod System.Web tag’inin içinde bulunmalıdır.

<membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
      <providers>
        <clear />
        <add
          name="SqlMembershipProvider"
          type="System.Web.Security.SqlMembershipProvider"
          connectionStringName="AspNetMembershipSampleConnection"
          applicationName="MembershipAndRoleProviderSample"
          enablePasswordRetrieval="false"
          enablePasswordReset="false"
          requiresQuestionAndAnswer="false"
          requiresUniqueEmail="true"
          passwordFormat="Hashed" />
      </providers>
    </membership>

Yazmış olduğum kod’da herşey açıkça ortadadır, fakat baktığımızda anlam veremeyeceğimiz bir nokta <clear/> kullanılması. Web.config dosyası, proje oluşturulduğunda machine.config isimli bir dosyadan alır. Bu dosya içerisinde varsayılan olarak ayarlanmış olan ASP.NET Membership yapısı SQL Express kullanmaktadır, fakat ben veritabanımı SQL Server 2008 R2 üzerinde tutuyorum. Bu durumda projemi run edersem bana zaten bir connection var olduğu söylenir. Fakat varolan bu connection benim connection bilgim değil. Bu nedenden ötürü yazmış olduğum <clear/> tag’I machine.config dosyasından gelen ayar’ı override ederek, benım yazmış olduğum connection bilgilerini varsayılan duruma getiriyor. Web.config dosyamızda gereken tüm ayarlamaları yapmış bulunmaktayız.

ASP.NET Membership temek olarak 3 yapıyı bünyesinde barındırır.

1- Membership: Üyelik işlemleri ile ilgili kısımdır.

2- Role: Üyelerin yapabileceği işlemleri kısıtlamaya yarar. Bu kısıtlamalar yönetici tarafından belirlenir.

3- Profile: Bir üyelik kaydı almak için aslında temel olarak bir kullanıcı adı ve şifre isteriz. Bunun haricinde ki tüm bilgileri isteyip istememek tamamen size kalmış. Profile ile kullanıcıdan ek bilgiler isteyebilirsiniz (TC Kimlik No, Ev Adresi, Telefonu vs. ).

Şimdi Solution Explorer’a geri dönüp ASP.NET Configuration’ı çalıştırıyoruz.

image

Karşımıza çıkan ekran eğer aşağıda ki gibiyse, yazdığınız kod bloğunda bir hata var demektir.

image

Bu ekranı aldığınız takdirde kod tarafında düzeltme yapmanız gerekiyor. En ufak bir harf hatası bile bu hatayı almanıza yeterlidir. Kodumuzu gözden geçirip tekrar ASP.NET Configuration’u çalıştırıp Provider sekmesinde geldiğimiz zaman aşağıda ki ekran görüntüsü karşımıza çıkıyor.

image

 

Bu ekranda bizim seçimimiz ikinci seçenek olan Select a different provider for each feature (advanced) olacaktır. Çunku ilk seçenek tüm özelliklerin tek bir provider’dan sağlanacağını belirtiyor, fakat biz her bir özellik için farklı provider seçmek istiyoruz.

Seçimimizin ardından ekrana şekildeki gibi bir görüntü geliyor, bu görüntüde Test linkine basıp Connection durumunu test ediyoruz.

image

Test linkine bastıktan sonra eğer şekilde ki gibi mesaj alıyorsanız herşey hazır demektir.

image

Bu makalemin bir sonra ki bölümünde Visual Studio’da kontrolleri kullanarak, yapmış olduğumuz ASP.NET Membership implementasyonunu uygulamak olacak. Görüşmek üzere.

4 responses so far

Aug 25 2011

ASP.NET Membership, Roles, Forms Authentication–Part I ASP.NET Membership SQL Server Configuration

Published by under Asp.NET

Merhaba, uzun süredir gerek işlerim gerek okulum dolayısıyle makale yazabildiğim söylenemez, ancak stackoverflow’da biraz aktif olarak bulunabildim o kadar. Bugun uzun zamandır hakkında yazmak  istediğim bir konu olan ASP.NET Membership yapısından bahsedeceğim, ve konuyla ilgili bir örnek yapacağım.

Öncelikle, Membership dendiği zaman akla gelen şey tabii ki üyelik. Üyelik nedir? Hemen hemen çoğu Web Sitesinde bulunan bir yapıdır. Siteler bazı bilgilerini public olarak yayınlamaktan kaçınır. Bunun karşılığında sizin bazı kişisel bilgilerinizi isteyerek (İsim, Soyisim, Email, Doğum Tarihi vs.) bu bilgileri size private olarak verirler. Process son derece basittir. Bir web sitesi A ve B diye bilgiler tutar, A bilgisi public B bilgisi private’dır. Site, ziyaretçilerine A bilgisini gösterir, bilgilerini alıp üyeleri yaptığı kullanıcılarına hem A hem B bilgierini bir arada gösterir. ( Şahsi görüşümü belirtmek isterim; bir çok üyelik isteyen sitenin bu isteğinin nedeni tamamen sizin kişisel bilgilerinizi almaktır Smile ).  Üyelik sistemi nasıl olur peki? Genel olarak üyelik sistemi, giriş yaptığımız bir Web Sitesin’de bir form doldurarak gerçekleşir. Bu form’da size özel bir kullanıcı ismi ve şifre belirlenir. Bu bilgieri sizin sisteme giriş yapmanızı, ve sizi sistemde Üye olarak gösterir. Peki doldurduğumuz bu formlar nasıl yapılıyor? İşte ASP.NET Membership burada devreye giriyor ve işimizi kolaylaştırıyor. Bunu nasıl yapıyor diye soracak olursak eger, hemen kendimden örnek vereceğim. İlk yapmış olduğum ASP.NET projesinde ( DVD Kiralama sitesi yapmıştım), bir üyelik sistemi vardı. Veritabanımda User isimli tablo oluşturdum, ve genel kullanıcı bilgileri ( İsim, Soyisim, Email vs.) gibi bilgiler ile birlikte kullanıcı adı ve şifre bilgileri tuttum. Web Form’umda kendi oluşturmuş oldugum TextBoxlar ve Labellar ile güzel bir Kayıt ve Giriş User Controlleri oluşturdum. Kullanıcıların girmiş olduğı bilgileri bazı validasyonlar (Required Field Validator, Regular Expression Validator) yaparak veritabanına kaydettim. Yine aynı şekilde bir Üye Giriş ekranı tasarladım (Login View kontrolü), ve bu ekranın Anonymous User View modunda (yani henüz giriş yapmamış olan kullanıcıların göreceği ekranda), kullanıcıdan UserName ve Password bilgisi istedim. Hatta ekranımın screenshot’ını sizinle paylaşayım.

image

Kullanıcının girmiş olduğu bilgileri, veritabanından kontrol edip kullanıcıya gereken giriş iznini veriyordum.

FormsAuthentication.RedirectFromLoginPage(kullaniciAdi, (lgnUyeKutusu.FindControl("chkBeniHatirla") as CheckBox).Checked);

Bu işlemleri bu kadar detaylı anlatmamda ki sebep, bu işin ne kadar zahmetli olduğunu size göstermektir.. İşte bu zahmetten kurtulmak için devreye ASP.NET Membership teknolojisi giriyor. ASP.NET Membership yapısı .Net 2.0 sürümü ile developerlara sunulmuştur. Bu teknoloji ile developerlar meşakatli olmayan üyelik sistemlerini kurgularken, kullanımı son derece kolay, işlevselliği yüksek, ve esnek bir yapı olan ASP.NET Membership teknolojisi kullanarak, hiç kod yazmadan yukarıda anlatmış olduğum üyelik sistemini kurgulayabilir hale geldiler. Bahsettiğim kolaylığı görebilmek için hemen bir Workshop yapalım.

İlk olarak ASP.NET Membership teknolojisinde kullanılacak olan User bilgileri için SQL Server’da bir veritabanı oluşturalım. İsim olarak veritabanıma AspNetMembership veriyorum.(Ben SQL Sever 2008 R2 kullanıyorum)

image

Yapmış olduğum tek şey yeni bir veritabanı yaratmak, sizinde dikkat ettiğiniz üzere yaratmış olduğum veritabanına herhangi bir Tablo, Stored Procedure, veya View eklemedim. Çünku bunu yapmak ASP.NET Membership’in görevi. ASP.NET Membership’in bu görevi yerine getirmesi için bizim bir komut vermemiz gerekiyor. Bu komut için  aşağıda ki path’e gidiniz.

C: > Windows > Microsoft.NET > Framework > v4.0.30319 dizini altında bulunan  “aspnet_reqsql” isimli uygulamayı çalıştıralım. Uygulamayı çalıştırdığımız anda karşımıza ASP.NET SQL Server Setup Wizard çıkar.

image

Bu aşamada Next diyerek ilerliyoruz, çıkan seçeneklerden “Configure SQL Server for application services” seçeneğini seçip Next ile devam ediyoruz. Bir sonra ki ekranda SQL Server ve Veritabanı seçim kısmına geliyoruz. Burada Server, Authentication ve Database ayarlamalarını yapıyoruz.

image

Bu aşamada dikkat etmeniz gereken nokta, Database seçim kısmında oluşturmuş olduğunuz veritabanını seçmektir. Bu işlemin ardından Next diyerek devam ediyor 2 adım sonra işlemi tamamlıyoruz. Geri dönüp SQL Server’ımda oluşturduğum veritabanına bir göz atarsam, ASP.NET Membership sayesinde otomatik oluşturulmuş olan Tables, Stored Procedures, ve Views görüyorum.

image

Şu aşamada artık SQL Server’ımızı ASP.NET Membership teknolojisini kullanabilmemiz için hazır durumdadır. Bu makalemin ikinci bölümünde işin Visual Studio kısmında nasıl yürüdüğüne örneğimiz ile devam ederek değineceğiz.

No responses yet

May 18 2011

Runtime .exe Generator by SerkanHekimoglu

Merhaba,

Runtime .exe Generator programi, isminden de anlasilacagi uzere, runtime esnasinda yazmis oldugunuz kodu Build eder ve sonuc Success ise execute eder. Programin download linki: Runtime Exe Generator

No responses yet

May 15 2011

LinQ Code Generator by SerkanHekimoglu

Published by under LinQ

Merhaba. Su an starbucks’dayim ve  can sıkıntısından dolayı kendi işlerimi kolaylaştırmak amacı ile bir program yazdım. Program başlıktanda anlaşılacağı üzere projenizde yer alan LinQ Object Modeller için otomatik Code generate etmektedir. Kullanımı son derece basittir. Yapmanız gereken tek şey programı açıp, program üzerinden SQL’de ki Database’e bağlanmaktır. Bağlandıktan sonra SQL Databaseleri listelenir. Seçmiş olduğunuz bir Database için tablolar veya viewlar listelenir. Listelenenler için istediğiniz fonksiyonlar program tarafından yazılır (Insert, Update, Delete, Select, GetAll functions). Dikkat etmeniz gereken 3 şey vardır. Program sizden Solution ve ObjectModel ismi ister. Bu isimleri kendi projenizde olduğu gibi doğru bir biçimde yazmanız gerekir. Oluşacak olan dosyayı kayıt ederken uzantısını .cs olarak yazmanız direk size Class File vereceği anlamına gelir. Programı ayaküstü yazdım denebilir, bu yüzden geribildirimleriniz veya tavsiyeleriniz benim için çok önemlidir. Program ile ilgili hata, istek, görüş vb. şeyleri bana mail atarsanız sevinirm. Programın download linki : LinqGenerator (P.S Lutfen program’da exception aramaya kalkismayin :) dedigim gibi ayakustu isimi gormesi icin yazdim zaten kafamda bozuk :) oyle kullanin iste :) )

4 responses so far

Dec 27 2010

About Delay

Published by under General

Merhabalar. Yasadigim sorunlar yetmiyormus gibi birde hosting saglayicim olan ASPNIX tarafinda olan bir sorunun beni etkilemesi uzerine tum hostinglerim, accountum, ve site iceriklerim corrupted oldu, uzun bir sure siteler offline’a gecti. Sorunu yine gideremediler, ancak ben eski back-uplarima donerekten tekrar siteyi ayaga kaldirmaya calistim, birazda basarili oldum sanirim :) Tum icerik, ve interface en kisa surede eski haline donecektir. Tesekkurler.

No responses yet

Oct 01 2010

Sharepoint 2010 – How to Hide Site Actions

Published by under Sharepoint

Sharepoint 2010’da olusturudugunuz Web Application’da gormus oldugunuz uzere master page’de ust kisimda Site Actions icinde All Site Contents, Recyle Bin linki barindiran Ribbon bulunmaktadir. Olusturdugunu Web Application eger Anonim kullanici kabul ediyor ise, giren kullanicilarda bu linkleri gorebiliyorlar. Peki bu linkleri anonim kullanicilarin gormesini engelleyebilir miyiz? Evet. Sadece Admin yetkisini sahip kullanicilar bu ribbon’u gorebilir, anonim kullaniclar sadece sitenin icerigini gorebilirler. Bunun icin masterpage’de bir takim kod degisikligi yapmak gerekmektedir.

1- “View All Site Content” linkini kaldirmak icin:

masterpage de bulunan <Sharepoint:SPSecurityTrimmedControl tagini bulun, ve orada yer alan

PermissionString = ”ViewFormPages” degerini “ManageWeb” olarak degistirin. Degisikligi kaydedip page’i reload yapin. Eger degisiklik etki etmezse (buyuk ihtimalle eder) IIS’i restart edin ve takrar browser’dan page’i acin.

2- “Recycle Bin” linkini kaldirmak icin:

masterpage de bulunan <SharePoint:SPLinkButton runat = “server” NavigateUrl = “~site/_layouts/recyclebin.aspx” id = “idNavLinkRecycleBin” ImageUrl = “/_layouts/images/recycbin.gif” Text = “<%$Resources:wss,StsDefault_RecycleBin%>” PermissionsString=”DeleteListItems” /> kismini bulun, ve tekrar PermissinString degerini “ManageWeb” olarak degistirin. Degisikligi kaydedin ve page’i reload edin. Eger degisiklik gorunmez ise IIS’i restart edip tekrar page’i acin.

3- “Site Actions” menusunu kaldirmak icin:

masterpage de bulunan

<SharePoint:SiteActions runat = “server” AccessKey = “<%$Resources:wss,tb_SiteActions_AK%>” id = “SiteActionsMenuMain” PrefixHtml = “&lt;div&gt;&lt;div&gt;” SuffixHtml = “&lt;/div&gt;&lt;/div&gt;” MenuNotVisibleHtml = “&amp;nbsp;” >
<CustomTemplate>
————————-
————————-
————————-
</CustomTemplate>
</SharePoint:SiteActions>

tagini bulun. Ve bu kod blogunu oldugu gibi

<Sharepoint:SPSecurityTrimmedControl ID = “spstcSiteActions” runat = “server” PermissionString = “ManageWeb”>

—-Buraya—-

<SharePoint:SPSecurityTrimmedControl>

BURAYA yazan kisima tasiyin ve degisiklikleri kaydedin. Degisiklikler etki etmezse IIS’i restart edin ve page’i tekrar acin.

No responses yet

Sep 24 2010

Uzmaninasor’da yazar olmak ister misiniz?

Published by under General

Merhaba arkadaslar. Gun gectikte artan makale, ve hit sayimizla beraber, siz takipcilerimize elimizden geldikce aydinlatici bilgiler vermeye devam ediyoruz. Bu asamada belki sizde aramiza katilarak, bilgilerinizi bizi takip eden insanlar ile paylasmak istersiniz diye dusunduk, ve aramiza bizlerle beraber makale yazacak arkadaslar aramaya basladik. Detayli bilgi icin bizimle irtibata gecerek, bize kendinizden ve uzmanlik alaninizdan bahsedin. Sunu unutmayin ki iyi bir developer olmanin bir yoluda, makale yazarak insanlara kendinizi duyurmaktir.

Iletisim icin,

Serkan Hekimoglu – serkan@serkanhekimoglu.com

Kadir Sumerkent – kadir@sumerkent.com

2 responses so far

Aug 05 2010

Deflate Stream – Compress & Decompress

Published by under .Net,.Net Framework

Merhaba, üzerinde çal??makta oldu?um projede bugun yapm?? oldu?um bir i?lemin kodlar?n? sizinle payla?mak istiyorum. Senaryo asl?nda çok derin, ama ben k?saca bahsedeyim. Kullan?c? bir Windows App yard?m?yla SQL’e dosya yükler, veya bu dosyay? download eder. Tabi bu a?amada önemli olan ?ey içeriye yüklenen verinin boyutunun yüksek olabilece?inden dolay? bu dosyan?n içeri?ini s?k??t?rarark yüklemektir. Veriyi database’de tutacag?m?z alan BINARY tipindedir. Buyrun kodlar.

Dosyay? OpenFileDialog ile kullan?c?dan seçtiriyorum, ve seçilen dosyan?n path’ini a?a??daki function’a gönderiyorum.

   1:  public byte[] FileToByteArray(string filePath)
   2:          {
   3:              FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
   4:              BinaryReader br = new BinaryReader(fs);
   5:   
   6:              long totalBytes = new FileInfo(filePath).Length;
   7:   
   8:              byte[] buffer = br.ReadBytes(Convert.ToInt32(totalBytes));
   9:              bufferSize = totalBytes;
  10:   
  11:              fs.Close();
  12:              fs.Dispose();
  13:              br.Close();
  14:   
  15:              return Compress(buffer);
  16:          }

Bu function olu?turdu?u byte[] de?erlerini Compress isimli a?a??daki fonksiyon gönderiyor.

   1:  public static byte[] Compress(byte[] data)
   2:          {
   3:              MemoryStream ms = new MemoryStream();
   4:              DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress);
   5:              ds.Write(data, 0, data.Length);
   6:              ds.Flush();
   7:              ds.Close();
   8:              return ms.ToArray();
   9:          }

 

Bir dosyay? alarak, s?k??t?rd?k ve DB’ye kay?t etmeye haz?r hale getirdik.

?imdide DB’deki dosyay? kullan?c?n?n download etmesini sa?layacak kod blo?unu yaz?yorum.

   1:  FolderBrowserDialog dialog = new FolderBrowserDialog();
   2:                  dialog.ShowDialog(this);
   3:   
   4:                  if (!string.IsNullOrEmpty(dialog.SelectedPath))
   5:                  {
   6:                      string file = String.Format("{0}\{1}", dialog.SelectedPath, ocd.FILE_NAME);
   7:   
   8:                      FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write);
   9:                      BinaryWriter bw = new BinaryWriter(fs);
  10:   
  11:                      bw.Write(Decompress(ocd.FILE_DATA.ToArray()).ToArray());
  12:                      bw.Flush();
  13:   
  14:                      bw.Close();
  15:                  }

Burada 11. sat?rda ça??r?lan function’?n alm?? oldugu ocd.FILE_DATA, bizim SQL’de depolam?? oldu?umuz binary verisidir.

Gönderildi?i Decompress fonksiyonunun içeri?i a?a??daki gibidir.

   1:  public byte[] Decompress(byte[] data)
   2:          {
   3:              const int BUFFER_SIZE = 256;
   4:              byte[] tempArray = new byte[BUFFER_SIZE];
   5:              List<byte[]> tempList = new List<byte[]>();
   6:              int count = 0, length = 0;
   7:   
   8:              MemoryStream ms = new MemoryStream(data);
   9:              DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress);
  10:   
  11:              while ((count = ds.Read(tempArray, 0, BUFFER_SIZE)) > 0)
  12:              {
  13:                  if (count == BUFFER_SIZE)
  14:                  {
  15:                      tempList.Add(tempArray);
  16:                      tempArray = new byte[BUFFER_SIZE];
  17:                  }
  18:                  else
  19:                  {
  20:                      byte[] temp = new byte[count];
  21:                      Array.Copy(tempArray, 0, temp, 0, count);
  22:                      tempList.Add(temp);
  23:                  }
  24:                  length += count;
  25:              }
  26:   
  27:              byte[] retVal = new byte[length];
  28:   
  29:              count = 0;
  30:              foreach (byte[] temp in tempList)
  31:              {
  32:                  Array.Copy(temp, 0, retVal, count, temp.Length);
  33:                  count += temp.Length;
  34:              }
  35:   
  36:              return retVal;
  37:          }

 

??te bu kadar basit. Bu sistem sayesinde her türlü verinin içeri?ini Compress ederek DB’de saklayabilirsiniz. Hat?rlad???m kadar?yla SQL’de binary field’? max 2 GB’a kadar ver? tutabiliyor. 4 GB’da olabilir tabi :)

No responses yet

Jun 11 2010

C# And API’s

Merhaba, bu makalemde sizinler API yapisi uzerinde inceleme yapip ufak bir ornek yapmayi planliyorum.

API (Application Programming Interface) Programlar ve Islemci arasinda, komutlardan olusan bir arayuzdur. Genellikle Microsoft’un kendi komutlarindan olusur (Shutdown, Reboot, Open-Close CD-Rom etc.). Windows API’si binlerce fonksiyon, structure, bazi constantlardan olusur (kendi projelerinizde kullanabileceginiz). Bu fonksiyonlar C dili ile yazilmistir, dolayisiyla bunlari kullanmadan declare etmeniz gerekmektedir. DLL proseduru icin declaration islemi biraz kompleks bir sekilde olur. API declaration icin API Viewer kullanabilirsiniz. Bir cok ileri derece programlama dili API Programlamayi destekler. The Microsoft Foundation Class Library (MFC), yuklu miktarda Win32(API) icerir. ODBC API fonksiyonlari, database’de hizli islemler yapmaniza olanak saglar. API ile, uygulamaniz isletim sisteminizdeki dusuk dereceli (lower-level) servislere request atabilir. API binlerce fonksiyonalite destekler. MessageBox’dan Encryption veya Remote Computinge… Bir developer, API’yi kendi programina entegre etmeyi iyi bilmelidir.

APIlerin kullandiginiz isletim sistemi, islemci turune gore cesit cesti tipler icerebilir.

Isletim Sistemi bazli API:

Her bir isletim sistemi API’nin yaygin tiplerine sahiptir.

Ornegin;

Windows NT MS-DOS destekler. Win16,Win32,POSIX (Portable Operating System Interface), OS/2 console API ve Windows 95, MS-DOS, Win16, ve Win32 APIlerini destekler.

Win16 & Win32 API:

Win16, 16-Bit islemciler icin API ile yaratilmistir, ve 16 bitlik degerlere dayanir. Ornegin, Win16 programlarinizi MS-DOS’a baglayabilirsiniz (TSR programlari gibi).

Win32 ise Win16 ile ayni sekilde yaratilmis olup, 32-Bit islemciler icindir, ve 32-Bit’lik degerler kullanir.

Win32 API libraryleri isimlerinden sonra ‘32’ ifadesini icerir. (KERNEL32, USER32 gibi.)

Tum apiler 3 adet kutuphane ile implement edilmistir.

-Kernel

-User

-GDI

1-KERNEL

Kernel, KERNEL32.DLL isminde bir kutuphanedir, ve isletim sistemi’nin yeteneklerini icerir.

-Process Loading

-Context Switching

-File I/O

-Memory Management gibi..

Ornek olarak GlobalMemoryStatus fonksiyonu,size sistemin anlik kullandigi olarak kullandigi fiziksel ve sanal bellek boyutunu gosterir.

2-USER

User, USER32.DLL isminde bir kutuphanedir, ve bu kutuphaneyi kullanaraktan tum kullanici arayuzlerinin yonetimini saglayabilirsiniz.

-Windows

-Menus

-Dialog Boxes

-Icons gibi…

Ornek olarak DrawIcon fonksiyonu, belirtilen noktada size icon veya cursor cizer..

3- GDI (Graphical Device Interface) :

GDI, Win32 tabanli isletim sistemlerinde GDI32.DLL isminde, grafik cikis kutuphanesidir. Windows GDI kullanaraktan, menuleri dialog boxlari cizer. GDI, bir noktada imagelarin saklanmasinda da gorev alir.

Ornek olarak CreateBitmap fonksiyonu, belirtilen ozel olculerde, renklerde bitmap yaratir.

C# Ve API Arasindaki Iliski

APIleri C# icerisinde implement etmek, yazilima yeni baslayanlar icin agir bir istir. Boyle bir islem yapmadan once, bilmeniz gereken bazi basliklar vardir. Bunlara ornek olarak, Structure Implement in C# , type conversion, safe/unsafe code, managed/unmanaged code, ve daha bir cok.

Kompleks APIlerin implementasyonunun once, basit bir MessageBox API implementasyonu ile baslayalim. MessageBox API’sine kod implement etmeden once basit bir Windows Application yaratalim, Form’a bir tane button ekleyin ve Button’un click eventinde Message Box’da kod gosterelim. Tabii ki bu islem icin harici bir kutuphane kullanacagiz.

Kullanilacak NameSpace:

using System.Runtime.InteropServices;

Ve simdiki satira dikkat! Bu satirda API’ deklarasyonu yapiyoruz:

[DllImport("User32.dll")]

public static extern int MessageBox(int h, string m, string c, int type);

Unmanaged Code’dan cagrilacak method icin DLL importu yaptik, “USER32” ifadesi ise hangi DLL’i import edecegimizi belirtmek amacli kullanilmistir. Kullanmis odugumuz MessageBox(), integer donduren, ve 4 parametre alan bir fonksiyondur.

Bir cok API degerleri kullanmak ve getirmek icin structure yapisi kullanir.

Button’un click eventine asagidaki kod blogunu ekleyelim

protected void button1_Click (object sender, System.EventArgs e)
{
MessageBox (0,"API Message Box","API Demo",0);
}

Uygulamanizi Run ettiginiz zaman, APi fonksiyonunu kullanarak cagirmis oldugunuz bir messagebox goreceksiniz.

Birde structure kullanaraktan bir ornek yapalim.

Structure ile calismak, komplex APIler kullanir, veya structure icerisinde structure kullanir. Bu islemlerler siradan basit bir API kullanmaktan daha zordur. Structure ornegimde GetSystemInfo API’sini kullanaraktan, varolan sistem bilgilerini cekecegim.

Yeni bir C# formu acin, ve bir tane button ile listbox ekleyin. Kod tarafina asagidaki namespace’i ekleyin

using System.Runtime.InteropServices;

Declare structure, GetSystemInfo’nun bir parametresidir. Ustteki kod blogunun hemen ardindan

[StructLayout(LayoutKind.Sequential)]

public struct SYSTEM_INFO {

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

API fonksiyonun deklarasyonu: bu islem icin kernel32.dll’ini import ediyoruz.

[DllImport("kernel32")]

static extern void GetSystemInfo(ref SYSTEM_INFO pSI);

   1:  protected void button1_Click (object sender, System.EventArgs e)
   2:  
   3:  {
   4:  
   5:  try
   6:  
   7:  {
   8:  
   9:  SYSTEM_INFO pSI = new SYSTEM_INFO();
  10:  
  11:  GetSystemInfo(ref pSI);
  12:  
  13:  //
  14:  
  15:  //
  16:  
  17:  //
  18:  
  19:  
  20:  
  21:  
  22:  listBox1.Items.Insert(0,pSI.dwActiveProcessorMask.ToString());
  23:  
  24:  //
  25:  
  26:  //
  27:  
  28:  //
  29:  
  30:  }
  31:  
  32:  catch(Exception er)
  33:  
  34:  {
  35:  
  36:  MessageBox.Show (er.Message);
  37:  
  38:  }
  39:  
  40:  }

Application’ i Run ettikten sonra, sekildeki gibi sistem bilgilerini goruntuleyebileceksiniz.

image

No responses yet

Jun 09 2010

Microsoft .Net Framework 4.0 – Chart Technology (PART II)

Bir onceki yazimda, chart hakkinda ufak bir bilgi verip, source kodlari ile yapilisi hakkinda bir ornek yapmistim. Bu makalede, olayi biraz daha ust bir boyuta tasiyip, kullanacagimiz chart’a DataBind yapip, kod tarafinda dinamik bir chart olusturacagiz. Senaryo olarak, bir ogrencinin quizlerinden, midtermlerinden, ve finalinden almis oldugu notlari bir chart kullanarak raporlayacagim.

SQL – Serverda kullanacagim veriler icin altyapiyi olusturalim. Ogrenci tablosu icinde ogrencinin Adi-Soyadi, Quiz1, Quiz2, Quiz3, Quiz4, Quiz5, Midterm1, Midterm2, ve Final isimli fieldlarim olsun.

image

Sekilde gordugunuz gibi iki ogrenci icin Quiz,Midterm, ve Final notlarini DB’de tutuyorum.

Algoritmamiza gore oncelikle, datanin tutulacagi bir DataTable olusturuyoruz, ardindan data’yi cekip olusturdugumuz DataTable’a Bind ediyoruz, ve Fieldlardaki degerleri Chartimizda olmasi gereken yerlere set ediyoruz. Asagidaki kod blogunu uygulayarak.

Oncelikle .aspx sayfamiza bir tane Chart surukleyip birakiyoruz, ve gereken degerleri set ediyoruz:

   1:  <asp:Chart ID="studentGradesChart" runat="server">
   2:          <Series>
   3:              <asp:Series Name="Student" ChartType="Line" YValuesPerPoint="2">
   4:              </asp:Series>
   5:              <asp:Series Name="Student2" ChartType="Line" YValuesPerPoint="2">
   6:              </asp:Series>
   7:          </Series>
   8:          <ChartAreas>
   9:              <asp:ChartArea Name="ChartArea1">
  10:              </asp:ChartArea>
  11:          </ChartAreas>
  12:      </asp:Chart>

Ve sayfamizin Page_Load kismini bu kodlari koyuyoruz.

   1:  if (!Page.IsPostBack)
   2:          {
   3:              // DataTable olusturma
   4:              DataTable dt = new DataTable();
   5:              dt.Columns.Add("Isim", typeof(string));
   6:              dt.Columns.Add("Soyisim", typeof(string));
   7:              dt.Columns.Add("Quiz1", typeof(int));
   8:              dt.Columns.Add("Quiz2", typeof(int));
   9:              dt.Columns.Add("Quiz3", typeof(int));
  10:              dt.Columns.Add("Quiz4", typeof(int));
  11:              dt.Columns.Add("Quiz5", typeof(int));
  12:              dt.Columns.Add("Midterm1", typeof(int));
  13:              dt.Columns.Add("Midterm2", typeof(int));
  14:              dt.Columns.Add("Final", typeof(int));
  15:              dt.AcceptChanges();
  16:  
  17:              // istenilen datayi cekiyoruz
  18:              StudentObjectModelDataContext dc = new StudentObjectModelDataContext();
  19:  
  20:              List<Student> secilenOgrenciler = (from s in dc.Students select s).ToList();
  21:  
  22:              foreach (Student ss in secilenOgrenciler)
  23:              {
  24:                  // Datayi, satirlara yerlestiriyoruz.
  25:                  object[] row = new object[]
  26:                  {
  27:                  ss.StudentName,
  28:                  ss.StudentLastName,
  29:                  ss.Quiz1,
  30:                  ss.Quiz2,
  31:                  ss.Quiz3,
  32:                  ss.Quiz4,
  33:                  ss.Quiz5,
  34:                  ss.Midterm1,
  35:                  ss.Midterm2,
  36:                  ss.Final
  37:                  };
  38:                  dt.Rows.Add(row);
  39:              }
  40:  
  41:              // Gelen Datayi, DataTable'a bagliyoruz
  42:              studentGradesChart.DataSource = dt;
  43:  
  44:              // Chart tipi secimi. Bu asamada bircok cesitten istediginizi secebiliyorsunuz.
  45:              studentGradesChart.Series["Student"].ChartType = SeriesChartType.Line;
  46:              studentGradesChart.Series["Student2"].ChartType = SeriesChartType.Line;
  47:  
  48:              int seriesIndex = 0;
  49:              foreach (DataRow dr in dt.Rows)
  50:              {
  51:                  // Bu sekmede chart ozelliklerini customise ediyoruz. 
  52:                  // Kullanisli olan bircok property mevcut
  53:                  studentGradesChart.Series[seriesIndex].MarkerStyle = MarkerStyle.Cross;
  54:                  studentGradesChart.Series[seriesIndex].MarkerSize = 8;
  55:                  studentGradesChart.Series[seriesIndex].MarkerBorderWidth = 7;
  56:                  studentGradesChart.Series[seriesIndex].ToolTip = String.Format("Student Number : {0}", seriesIndex + 1);
  57:  
  58:                  // Degerleri Chart'a set ediyoruz.
  59:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Quiz 1", dr["Quiz1"]);
  60:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Quiz 2", dr["Quiz2"]);
  61:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Quiz 3", dr["Quiz3"]);
  62:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Quiz 4", dr["Quiz4"]);
  63:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Quiz 5", dr["Quiz5"]);
  64:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Midterm 1", dr["Midterm1"]);
  65:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Midterm 2", dr["Midterm2"]);
  66:                  studentGradesChart.Series[seriesIndex].Points.AddXY("Final", dr["Final"]);
  67:  
  68:                  seriesIndex++;
  69:              }
  70:          }

Kod’u Run ettigimizde sekildeki gibi bir goruntu elde ediyoruz:

image

Elimden geldigince fikir edinmek adina, bir ornek yaptim. Tabii ki Chart konusu son derece derin bir konu. Bu konu ilgili bilgi edindikce bunlar ile ilgili ornekler yapmaya devam edecegim. Islerimin yogunlugundan firsat bulursam, bir sonraki asamada bir sirkete bagli olan alt kurumlarin ay bazinda yapmis oldugu cirolari gosteren bir chart yapmayi planliyorum.

Serkan Hekimoglu.

No responses yet

Next »