Aug 05 2010

Deflate Stream – Compress & Decompress

Published by Serkan Hekimoglu 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 :)

  • Share/Bookmark

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

  • Share/Bookmark

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.

  • Share/Bookmark

No responses yet

Jun 08 2010

Microsoft .Net Framework 4.0 – Chart Technology

Published by Serkan Hekimoglu under Asp.NET

Merhaba, bu makalemde sizin icin .Net Framework 4.0 ile gelen Chart teknolojisi uzerinde inceleme ve ornek yapacagim.

Chart nedir? Chart gundelik hayatta bile her yerde gorebilecegimiz grafikler ile gosterilen istatistiklerdir. Kullananlar bilirler ki .Net 3.5 doneminde chart kullanmak icin component indirirdik, fakat artik VS2010 ile bu component default olarak geliyor, ve ASP.NET projelerimizde Add-On kullanmadan Charting teknolojisini kullanabiliyoruz. Microsoft’a bu guzelliginden dolayi tesekkur ederiz :)

image

Hemen ufak bir ornek ile Chart teknolojisi kullanimi hakkinda ufak bir bilgi edinelim, ve VS2010’umuzu acip bir ASP.NET projesi olusturalim.

image Gordugunuz uzere Toolbox > Data sekmesinde Chart Componenti default olarak gorunmektedir. Ustelik kullanimi da oldukca basittir. Bu yapiyi kullanmak icin Configuration File’a herhangi bir registration yapmaya gerek yoktur.

Olusturmus oldugumuz bir .aspx sayfasina Chart componentini surukleyip birakalim.

image image

Eklemis oldugunuz Chart componentinin goruntusunude sekildeki gibi degistirebilirsiniz:

image

Source kismina gecerek Hard Coded olarak cok kucuk bir ornek yapmak istiyorum. Istanbul icin tahmini 5 gunluk hava durumu gosteren bir chart hazirlayip, gun gun hava sicakligini belirtelim.

image

Bir Charta default olarak value set etmek icinde sekilde gormus oldugunuz gibi Hard Coded olarak DataPointlerin, AxisLabel ve koordinat sistemindende bileceginiz uzere YValuelarinin degerlerini set edip, refresh ettigimizde sekilde ki goruntuyu elde ediyoruz:

image

Ilk kismi burada bitiriyorum. Ikinci kisimda daha detayli bir sekilde Chartlara DB’den databind edip dynamic olarak islemler yaptirmaya yonelik ornek yapacagim.

  • Share/Bookmark

No responses yet

Jun 07 2010

Create Your Own RSS (Real Simple Syndication) Reader With .NET

Published by Serkan Hekimoglu under .Net Framework

Merhaba, bu makalemde sizlerle .Net platformu uzerinden kendi RSS Reader’imizi olusturmaya dair ornek yapacagim. Oncelikle RSS nedir? RSS çe?itli internet siteleri taraf?ndan yay?nlanan haber vb. içeri?in tek bir ortamdan topluca izlenebilmesine olanak sa?layan yeni bir içerik besleme yöntemidir. RSS yöntemini destekleyen sistelerin haz?rlad?klar? XML biçimli dosyalara bir çok programla eri?mek mümkündür. XML okuyucusu olan bu programlar, web gezgini veya e-posta istemcisi olabilece?i gibi sadece RSS içereri?i izlemek için haz?rlanan masaüstü programlar? da olabilir. RSS Urllerini ister DB de muhafaza eder her seferinde elle yazmaya gerek kalmadan DB’den okuruz, veya benim ornekte yapacagim gibi tek bir URL kullanarakta yapilabilir.

Oncelikle Rss Reader icin bir windows app project olusturalim.

image

 

Hemen ardindan sekilde UI tasarimini yapalim.

 

image

Globalde tanimlanan degiskenler:

XmlTextReader rssReader;
XmlDocument rssDoc;
XmlNode nodeRss;
XmlNode nodeChannel;
XmlNode nodeItem;
ListViewItem rowNews;

 

Read Button Click Eventinde yazilacak kod :

   1:  rssReader = new XmlTextReader(txtUrl.Text);
   2:              rssDoc = new XmlDocument();
   3:   
   4:              rssDoc.Load(rssReader);
   5:   
   6:   
   7:              for (int i = 0; i < rssDoc.ChildNodes.Count; i++)
   8:              {
   9:   
  10:                  if (rssDoc.ChildNodes[i].Name == "rss")
  11:                  {
  12:   
  13:                      nodeRss = rssDoc.ChildNodes[i];
  14:                  }
  15:              }
  16:   
  17:              for (int i = 0; i < nodeRss.ChildNodes.Count; i++)
  18:              {
  19:   
  20:                  if (nodeRss.ChildNodes[i].Name == "channel")
  21:                  {
  22:   
  23:                      nodeChannel = nodeRss.ChildNodes[i];
  24:                  }
  25:              }
  26:   
  27:              lblTitle.Text = "Title: " + nodeChannel["title"].InnerText;
  28:              lblLanguage.Text = "Language: " + nodeChannel["language"].InnerText;
  29:              lblLink.Text = "Link: " + nodeChannel["link"].InnerText;
  30:              lblDescription.Text = "Description: " + nodeChannel["description"].InnerText;
  31:   
  32:              for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
  33:              {
  34:   
  35:                  if (nodeChannel.ChildNodes[i].Name == "item")
  36:                  {
  37:                      nodeItem = nodeChannel.ChildNodes[i];
  38:   
  39:   
  40:                      rowNews = new ListViewItem();
  41:                      rowNews.Text = nodeItem["title"].InnerText;
  42:                      rowNews.SubItems.Add(nodeItem["link"].InnerText);
  43:                      listBox1.Items.Add(rowNews.Text);
  44:                  }
  45:              }

Ve son olarak eklemis oldugumuz listBox’in Selected Index Changed Eventine eklenecek kod:

 

URL Text Box’ina yazilan Rss URL’i Read Buttonunda kullanilacak olan URL’dir, ve List Box’a URL icerisindeki veriler gelir.

 

if (listBox1.SelectedItems.Count == 1)
            {

                for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
                {

                    if (nodeChannel.ChildNodes[i].Name == "item")
                    {
                        nodeItem = nodeChannel.ChildNodes[i];

                        if (nodeItem["title"].InnerText == listBox1.SelectedItems[0].ToString())
                        {
                            txtContent.Text = nodeItem["description"].InnerText;

                            break;
                        }
                    }
                }
            }
  • Share/Bookmark

No responses yet

May 21 2010

.NET Framework Class Library Process.Id Property. How To Kill Process in .Net

Published by Serkan Hekimoglu under Uncategorized

Bugun yazmis oldugum uygulamada birseyi farkettim; uygulama algoritma olarak bir DataTable olusturuyor, ve icerideki yuklu miktarda Data’yi daha sonra Excel dosyalari olusturarak kullanicinin secmis oldugu bir path’e kaydediyor. Bunun icin algoritma son derece basit, excel servisi baslatilir, icerisindeki sheetlere datalar yazilir, ve sonra servis kapatilir. Fakat islemler bittikten sonra gordum ki Task Manager’da Process sekmesinde VS tarafindan acilan EXCEL.EXE islemleri kapatilmamis. Haliyle programin her bir execute asamasinda ordaki Process’ler kill olmadan birikiyor ve RAM tuketimini arttiriyor. Bunu manual yapacak bir kod hazirladim ce bunu sizinle paylasmak istiyorum.

Oncelikle senaryoda dikkat etmemiz gereken bir sey var. O da program sonlandiktan sonra, programin yaratmis oldugu EXCELleri sonlandirmak demek acik olan tum excelleride sonlandirmak demek oluyor. Bu yuzden izlememiz gereken yol su sekilde olmalidir:

try
            {
                // Islemler baslamadan once, varolan EXCEL.EXElerin
                // Process IDlerini bir liste icerisinde tutariz.
                // List<int> startingProcessIds = new List<int>();
                // Listemizin elemanlari ornek verecek olursak 1,2, ve 3 olsun
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                // Tum islemler bittikten sonra, excel dosyalarimiz olustuktan sonra
                // Goruyoruz ki Task Manager'da acilan EXCEL.EXElerin sayisi artmis.
                // Cunku VS bu acik olanlari kapatamadi.
                // List<int> endingProcessIds = new List<int>();
                // Tanimlamis oldugumuz listeye ayni sekilde su anki tum
                // Process Idleri dolduruyoruz.
                // Ve en son asamada iki liste arasindaki farki bularak
                // Ikinci listede olup, ilk listede olmayanlar bizim uygulamamiz
                // tarafindan yaratilmis olan EXCEL.EXEler anlamina geliyor
                // yazmis oldugumuz uygulamalar ile o precess idleri kill ediyoruz.
            }

Algoritmayi kurduktan sonra simdi gelelim kod asamasina:

1- Task Manager’da yer alan Processlerin ID’si nasil okunur?

List<string> startingProcessIds = new List<string>();
            Process[] localByName = Process.GetProcessesByName("EXCEL");

            int i = localByName.Length;
            while (i > 0)
            {
                processIds.Add(localByName[i - 1].Id.ToString());
                i -= 1;
            }

Adini vermis oldugumuz process’e ait acik olan tum .exelerin IDleri, startingProcessIds isimli List’e dolmaktadir.Ayni islemi program finally asamasina geldiginde tekrar yapiyoruz ve bu sefer process idleri endingProcessIds isimli listeye dolduruyoruz.

 

2- Task Manager’da yer alan Process’in KILL edilme islemi:

Asagidaki kod blogunda endingProcessIds listesinin ilk elemaninin ID’sini aliyorum, daha sonra o ID’nin aradigim exe’ye ait olup olmadigi kontrolunu yapiyorum : chosen.ProcessName == “EXCEL”

Kontrollerden gectikten sonra, chosen.Kill() fonksiyonu ile islemi KILL ediyoruz :)

 

Process chosen;
            i = localByName.Length;
            while (i > 0)
            {
                string id = endingProcessIds[0];
                if (id == "")
                {
                    break;
                }
                try
                {
                    chosen = Process.GetProcessById(Int32.Parse(id));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    continue;
                }
                if (chosen.ProcessName == "EXCEL")
                {
                    chosen.Kill();
                    chosen.WaitForExit();
                }
                i -= 1;
            }
  • Share/Bookmark

No responses yet

Apr 23 2010

Microsoft Turkiye Zirvesi

Published by Serkan Hekimoglu under Uncategorized

27  Mayis 2010 Cumartesi gunu yapilacak olan Microsoft Turkiye zirvesinde yerinizi almayi unutmayin. Kayit icin tiklayin

  • Share/Bookmark

No responses yet

Feb 15 2010

Introduction to Mobile Application Development

Merhaba arkadaslar, bu makalemde sizlere .NET Compact Framework ve Mobile programlamay? anlataca??m. Örneklerde tahmin edece?iniz üzere C# kullanaca??m. VB’ciler için VB.NET ile de anlatmak isterdim ama VB’ye bir türlü ?s?namad?m. C# oldu?u sürecede ?s?nabilece?imi pek dü?ünmüyorum.

Bildi?iniz üzere ülkemizde bilgisayardan çok cep telefonu kullan?lmaktad?r. Haz?r önümüz 3G ve 4G iken mobile programlamada geli?en telefonlarla beraber popüler olacakt?r. Bence Türkiye mobile yaz?l?m alanda at?l?mlar yapmak için güzel bir yer ve ?uan sektöründe bu at?l?mlara ihtiyac? var.

K?saca ?öyle bir mutfa?am?za bakacak olursak;

Elimizde bir adet Visual Studio.NET 2008 var. Bunun yan?nda bolca C# ve .NETCF var. ?imdi bunlar? kullanarak güzel mobile uygulamalar ç?kartaca??z.

?lk olarak Yeni bir proje olu?tur diyoruz ve aç?lan menüden Visual C# > Smart Device > Smart Device Project yolu ile yeni bir proje olu?turuyoruz.

image

Ilk basta vazgecilmez ornegimiz olan ”Hello World” yazarak baslamak istiyorum.Resimde de gordugunuz uzere bir adet button koyduk, ve button’un click eventinde ekranda bir messageBox kullanarak “Hello World” yazisini basacagiz.

private void button1_Click_1(object sender, EventArgs e)
        {
            MessageBox.Show("Hello World!");
        }

 

Gordugunuz uzere normal bir Windows Application gelistirmekten pek bir farki yok. Bu windows mobile applicaton development’a giris icin kucuk bir adim oldu :) Asil size bahsetmek istedigim konu ise Windows Mobile 6.5 uzerinde gelistirilebilen Widgetlar.

Bu test süreci birkaç a?amadan olu?maktad?r. Öncelikle widget için haz?rlad???n?z dosyalar? *.zip haline getirmeniz gerekmekte. Bir sonraki a?amada bu *.zip uzant?s?n? *.wgt ya da *.widget olarak de?i?tirmeniz gerekmekte ve bu dosyay? emulatör üzerinde kopyalay?p (bu kopyalama i?leminide emulatör ile payla??ml? bir klasör üzerinden gerçekle?tirebilirsiniz) gerekli kurumlar? yapman?z gerekmekte. Ayr?ca bir önce test’ ten kalan kurulumunuzu kald?rman?z ve yeni halini kurman?z test’ i daha stabil k?lmaktad?r.

Her seferinde bu süreç can s?k?c? olabildi?inden geçen hafta tam ihtiyaç duyulan bir çal??maya CodePlex üzerinde rastlad?m ; Windows Mobile Widget Emulator !

CodePlex üzerinde aç?k kaynakl? olarak geli?imine devam eden çal??ma, kullan?c?lara geli?tirdikleri Windows Mobile Widget’ lar? Emülatör’ e kurmaya gerek kalmadan "sanki mobil cihaz üzerinde çal??t?r?l?yormu? gibi" test imkan? sa?lamaktad?r.

image

Örne?in CodePlex üzerinden al?nan yukar?daki ekran görüntüsün, geli?tirilen bir widget’ ?n masaüstü ortam?nda Windows Mobile Widget Emulator ile çal??t?r?ld??? görülmektedir.

Peki Nas?l Kullanaca??z ?

http://widgetemulator.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=31211 adresinden gerekli paketi indirdi?imizde a?a??daki islemleri uyguluyoruz: assests klasörü uygulaman?n çal??t?r?labilmesi için gereken sistemsel dosyalar? içermektedir. widgets klasörü "geli?tirdi?imiz widget’ ? paketlemeden yerle?tirece?imiz" bölgedir. index.htm ise widget’ ?m?z? test edece?imiz standart bir HTML dosyas?d?r.

Yukar?da da belirtti?imiz üzere geli?tirdi?imiz widget’ ? "paketlemeden" widgets klasörü içerisine yerle?tirmemiz gerekmektedir. Sadece bu kadar!

Windows Mobile 6.5 üzerinde geli?tirilen widget’ larda yararlan?labilecek bir ba?ka nokta ise bir önceki yaz?m?zda ifade etti?imiz “widget” javascript objesi üzerinden olu?turulabilecek SystemState objesidir. SystemState objesi vas?tas?yla geli?tirdi?iniz widget’ lar içerisinden “baz? belirli” sistemsel özelliklerin de?erlerine ula?abilir, bu de?erlerin de?i?ti?ini alg?layabilir ve istenilen kod bloklar?n? çal??t?rabilmektesiniz. A?a??daki listede SystemState objesi üzerinden ula??labilecek de?erlerin bir listesi listelenmi?tir.

CradlePresent – Cihaz?n “cradle” (cihaz?n bilgisayar?n?z ile olan fiziksel ba?lant?s?) üzerine tak?l?p tak?lmad???n?n de?erini döndürür.

DisplayRotation – Ekran?n anl?k görüntüsünün kaç derecelik bir aç?yla gösterildi?inin de?erini döndürür. (0 – 360 Derece Aras?)

PhoneHomeService – Cihaz?n anl?k network ile kay?tl? olup olmad???n?n de?erini döndürür.

PhoneOperatorName – Cihaz?n anl?k network (operatör) isim de?erini döndürür.

PhoneRoaming – Cihaz?n anl?k olarak “Roaming (Yurtd???nda farkl? bir operatör üzerinden ba?lant?)” içerisinde olup olmad???n?n de?erini döndürür.

PhoneSignalStrength – Cihaz?n operatör ile aras?ndaki ba?lant? kalitesinin de?erini yüzdelik olarak döndürür.

PowerBatteryState – Cihaz?n anl?k batarya güç de?erini dü?ük, güçlü, orta ?eklinde tan?ml? de?erlerinin numerik kar??l?klar?n? döndürür.

PowerBatteryStrength – Cihaz?n anl?k batarya güç de?erini yüzdelik de?er olarak döndürür.

 

Bir sonraki makalemde sizlerle bu yukarida bahsetmis oldugum SystemState objelerini kullanaraktan Mobile Application gelistirecegiz.

  • Share/Bookmark

No responses yet

Jan 21 2010

ASP.Net Samples – Part III: System.Net.Mail with ASP.Net

5 – System.Net.Mail ile Mail Send

Merhaba arkadaslar, bugun sizlere ASP.Net uzerinden Mail gonderme islemi uzerine ornek yapacagiz. Gunumuzde E-Mail yapisi bilmeyen pek az insan vardir sanirim. E-Mail, dunya capinda Bireysel ve Kurumsal olarak kullanilan bir yapidir. Bireysel kullanimlara ornek vermek istersek eger cok yaygin olan mail servislerinden ornek verebiliriz (gmail,hotmail,yahoo gibi). Kurumsal kullanimlarda genelde Microsoft Exchange Server tercih edilir. Exchange serverdan bahsetmek isterdim ama off topic olmamak adina bahsetmesem iyi olur. Gelelim mail gonderme islemini kendi yarattigimiz bir .aspx veya Windows Application uzerinden yapmaya. 2 yapi arasinda pek bir fark oldugu soylenemez acikcasi. Oncelikle bu islemi yapabilmek icin sahip oldugunuz mail adresinizi bir takim bilgilerine ihtiyac duyarsiniz. SMTP, Incoming – Outgoing adresleri gibi. Kendinize ozel bir isim hakki ve domaininiz var ise bu is daha kolay tabi. Ornek vermek gerekirse sahip oldugum www.serkanhekimoglu.com ismi, ve barindirdigim serverimin saglamis oldugu avantajlar dogrultusunda kendi alan adim uzantisinda mail adresi olusturabiliyor. (serkan@serkanhekimoglu.com) gibi. Incoming ve Outgoing bilgilerimde haliyle mail.serkanhekimoglu.com oluyor. Gelelim simdi bunu form uzerinde nasil yapacagimiza.

Isleme baslamak icin bir adet .aspx sayfasi olusturalim, ve .Net’in mail gonderme yapisini kullanabilmek icin gerekli referanslari ekleyelim :

using System.Net.Mail;
using System.Net;

 

Mail gonderim sirasinda ki islemi basitce dusunecek olursak eger, Mesajimiz, gonderen, alici, konu, ve ana mesajdan olusur. Bunlara ek olarakdan CC, BCC, veya Attachment gibi olaylarda mevcuttur. Dolayisiyla bu degerleri cekebilecegimiz textBoxlari .aspx sayfamiza ekleyelim. Ve gelen kod kismina:

MailAddress From = new MailAddress(txtEmailAddress.Text.ToString(), txtName.Text.ToString() + " " + 
                                   txtSurname.Text.ToString());
        MailAddress To = new MailAddress("serkan@serkanhekimoglu.com");
        MailMessage Email = new MailMessage(From, To);
        Email.IsBodyHtml = true;
        Email.Subject = "Message From Serkanhekimoglu.com";
        Email.Body = txtMessage.Text.ToString();
        SmtpClient MailClient = new SmtpClient();
        MailClient.Host = "mail.serkanhekimoglu.com";
        MailClient.UseDefaultCredentials = false;
        MailClient.Credentials = new NetworkCredential("serkan@serkanhekimoglu.com", "MAILSIFRENIZ");
        MailClient.Port = 26;
        MailClient.Send(Email);

 

MailAddress’i biraz kurcalayacak olursaniz CC ve BCC gibi ozellikleride gorebilirsiniz. Burda sorun yaratabilecek tek sey Mail’in cikis port’u olabilir. Default port kullanilir veya manuel olarak cikis portu belirtilebilir. To kismini ister textbox’tan okursunuz ister kendiniz default bir mail adresi set edersiniz. (sekildeki gibi)

  • Share/Bookmark

2 responses so far

Jan 20 2010

ASP.Net Samples – Part II: File Upload, and Forms Authentication

3- File Upload

Merhaba arkadaslar, ASP.NET Samples konusu uzerine devam eden makalemizde bugun son derece basit ama kullanisli olan File Upload uzerine ornek yapacagim. File Upload uzerine aciklama yapilmasi pek de gerekli degildir aslinda, cunku adindan da anlasilacagi uzere .aspx sayfasi uzerinden Root’ta bulunan bir Folder’a kendi sistemimizden dosya aktaracagiz. Direk isleme baslamak istiyorum. Olusturmus oldugumuz solution’a YuklenenKlasorler adli bir folder ve .aspx sayfasi ekliyoruz. Toolbox’tan FileUpload, ve button kontrollerini .aspx sayfamiza ekliyoruz. Button’un click eventine asagidaki kodlari yaziyoruz.

protected void Button1_Click(object sender, EventArgs e)
    {
        string DosyaUzantisi = FileUpload1.FileName.
            Substring(FileUpload1.FileName.LastIndexOf(".") + 1);

        if (DosyaUzantisi.ToLower() == "jpg"
            || DosyaUzantisi.ToLower() == "gif"
            || DosyaUzantisi.ToLower() == "xml")
        {
                FileUpload1.SaveAs(Server.MapPath("YuklenenDosyalar\\") +
                RastgeleKod + "." + DosyaUzantisi);

        }
        else
        {
            Label1.Text = "Hatali Dosya Secimi";
        }
    }

Dosya uzantisini okumak icin. FileUpload.FileName.Substring(FileUpload.FileName.LastIndexOf(“.”) + 1) yani dosya adindaki son nokta karakterinden itibaren okuma islemi gerceklestirdik. IF blogu icerisinde kullanicinin aktarim yapabilecegi dosya turlerini belirtmis oluyoruz. Mesela yukaridaki ornegimizde kullanici sadece .jpg, .gif, ve .xml uzantili dosyalari, olusturmus oldugumuz YuklenenDosyalar isimli klasore aktarabilir. Bu kadar basit.

4- Forms Authentication

Asp sadece IIS authentication metodlar?n? desteklerken asp.net daha geni? güvenlik sistemini destekliyor örne?in IIS/Windows do?rulama sistemlerinden Basic do?rulama, Digest do?rulama, Integrated Windows do?rulama, Form bazl? do?rulama ve Microsoft Passport do?rulama. asp.net içerisinde yeni olarak Windows kullan?c? do?rulama (windows authentication) sistemine ek olarak form bazl? kullan?c? do?rulama (forms-based user authentication) sistemi geli?tirilmi?tir. bu yeni sistemde çerez yönetimi (cookie management) ve otomatik olarak do?rulanmayan kullan?c?lar?n ba?ka bir web sayfas?na gönderilmesi (automatic redirecting of unauthorized logins) gibi güzel özellikler eklenmi?tir. ?zlemek, Debug, ve Bellekleme Deste?i (Tracing, debugging and caching support)asp sisteminde kodu izlemek ve BUG lari bulmak bir derttir. Fakat asp.net içerisinde bu sistem çok daha geli?tirilmi?, ad?m ad?m debug olay? ve di?er trace ve debug metodlarini desteklemektedir. asp.net bunlara ek olarak mükemmel bellekleme (caching API) sa?lamaktad?r. Verileri bellekleme sistem output caching, data caching, dependent caching ve fragment caching metodlar?n? destekler.Alintidir.

Authentication Mode’umuzu belirlerken asp projemizde yer alan web.config dosyamizin icindeki  configuration alanini sekildeki gibi duzenliyoruz.

<configuration><system.web>

<security>

<authentication mode=”Forms“>

</authentication>

</security>

</system.web>

</configuration>

Ve ayni sekilde web.config dosyamiz icerisinde kullanici bilgileride tanimlanabilir.

<configuration>

<system.web>

<authentication mode=”Forms”>

<forms name=”.ASPXUSERDEMO” loginUrl=”login.aspx”

protection=”All” timeout=”60″>

<credentials passwordFormat=”Clear” >

<user name=”serkan” password=”serkan”/>

<user name=”kadir” password=”kadir”/>

<user name=”test” password=”user”/>

</credentials>

</forms>

</authentication>

<authorization>

<deny users=”?” />

</authorization>

<globalization requestEncoding=”UTF-8″ responseEncoding=”UTF-8″ />

</system.web>

</configuration>

Gibi…Su an vaktim olmadigindan dolayi orneklerimizi 3. bolume sarkitiyorum.

  • Share/Bookmark

No responses yet

Next »

Get Adobe Flash playerPlugin by wpburn.com wordpress themes