| CHIP | KASIM 2003 __?{___G___e___l___i___f___l___t___i___r___i___l___e___n___ ___h___a___b___e___r___ ___t___o___p___l___a___yı___cı___sı___ ___n___a___sı___l___ _____a___lı___f___lı___y___o___r___? Haber toplayıcı, program açılışında ve takip eden her beş dakikada bir www.chip.com.tr gibi web sayfalarını okur ve buradaki haberleri sabit diske kaydeder. Şayet program ana penceresindeki logolardan birine tıklanırsa ilgili başlıklar yeni bir pencere üzerinde ekrana getirilirler. Görünen yüzü Görünmeyen yüzü WWW okunması Haberlerin görüntülendi ği pencerenin açılması için tıklanması yeterlidir Beş dakikalık zaman dörgüsü Haber penceresinin görüntülenmesi Her bir web sayfası için kod satırlarının çalışması .TXT k saplayıcısı’nın hazırlanmasından daha fazla emek ister. Bu nedenle her bir program parçasının ayrılması çalışmanızı kolaylaştıracaktır. Proje tamamlandığı zaman toplam yedi farklı kod dosyasından meydana gelecek. Bunlardan iki tanesi, program ana penceresi ve bir web sayfasındaki en son makaleyi gösteren haber penceresi olmak üzere programın iletişim pencerelerini oluştururlar. Hazırladığınız aracın bir HTML sayfasını okuyabilmesi ve değerlendirebilmesi için her bir sayfaya özel olarak ayrı bir kod dosyası oluşturmalısınız. Burada hazırlanacak olan CHIP Bar toplam dört URL’yi inceleyecek. Son program parçası ise önemli bir görevi üstlenerek ünlü harşerin üstlerine konulan noktaların (örneğin, “ä” harŞ “ä” olarak yazılır) HTML kodunda sıkça kullanılan biçimini tekrar harfe dönüştürüyor. 2 I Hazırlık: Program ana penceresinin hazırlanması Kaynak kodun ilk satırları Bitrate Hesaplayıcısı’ndan daha farklı bir koda sahip değil. İlk olarak “using” yardımıyla program içerisinde yeni isim alanları hazırlıyorsunuz. İsim alanları, geliştiricinin devamlı olarak yeni tanımlamalar yapmak zorunda bırakmayan ve yeniden kullanılabilen kütüphanelerdir. Kod içerisindeki bu yapı sıradan bir görünüme sahip: using Chip_Bar_Sinif_Ayna; Pencerenin oluşturulması ile ilgili kaynak kodun geri kalan kısmı Bitrate Hesaplayıcısı’ndakine çok benziyor. 3 I Etkileşimli: Chip Bar, yeni yazıları beş dakikada bir nasıl arıyor? Kaynak koddaki “InitializeComponent()” yöntemini kullanarak pencerelerin nasıl görüneceğini tanımlayabilirsiniz. Fon rengi olarak ne kullanılacak? Araç çubuğunda hangi metin bulunacak? Söz konusu ve benzeri soruları burada cevaplamalısınız. Bunun nasıl yapılacağına ise ilk bölümde değinmiştik. Ancak burada pencereye ayrıca önemli bir hareket ifadesi vereceksiniz: Haberlerin dosyaya yazılması 173 CHIP | KASIM 2003 GÜNCEL » KAPAK » DONANIM » YAZILIM » HI-TECH » PRATİK » INTERNET 174 CHIP | KASIM 2003 C# ile Programlama GÜNCEL » KAPAK » DONANIM » YAZILIM » HI-TECH » PRATİK » INTERNET this.Load += new System.EventHandler(this.Pencere_Load); Bu satır bir EventHandler oluşturur. Bu, program penceresi ilk defa ekrana getirileceği zaman çalıştırılır. Birkaç satır sonra tanımlanacak olan “timer1”, haber toplayıcı için çok daha fazla önemlidir. Buradaki amaç, tamamlanan programın, ilgili web sayfalarını sadece çalıştırıldığı zaman değil belirli aralıklarla kontrol etmesini sağlamak ve böylece en yeni makalelere ulaşmaktır. Bunun için bir zaman sayacına, yani Timer’a ihtiyaç duyulur. this.timer1.Enabled = true; this.timer1.Interval = 300000; this.timer1.Tick += new System.EventHandler (this.timer1_Tick); İlk satır, Timer’ı başlatır, ikinci satır ise 300.000 milisaniyelik yani beş dakikalık geri sayım değerini atar. Bu sayaç şu şekilde çalışır: Timer, zamanın her tamamlanışında bir “Tick” olayı çalıştırır. Bu olay üçüncü kod satırında başlar ve ardından başka bir EventHandler çağırır. Söz konusu EventHandler daha sonra her bir Timer Tick komutunda yeniden çalıştırılır. Artık Windows’un pencereyi oluşturabilmesi için gereken tüm şartları yerine getirdiniz. Ancak program, şu ana kadar geliştirilme amacı doğrultusunda bir fonksiyona sahip değil. 4 I Özelleştirilmiş: Pencerenin devamlı monitörün kenarında oluşturulması Çalışması üçüncü adımda anlatılan “Load” EventHandler’ı burada da kullanılır: private void Pencere_Load(object sender, System.EventArgs e) { Rectangle rect = new Rectangle(); Rect = Screen GetWorkingArea(this); This ClientSize = new System.Drawing.Size(180, 200); this DesktopLocation = new System.Drawing.Point((rect.Width – _ 189, (rect.Top – rect.Y); yukle(); } Yukarıdaki kod parçası karmaşık görünebilir, ancak satır satır çözümlendiğinde daha rahat anlaşılacaktır. Kavisli parantezden sonraki ilk komut, ikinci satırda ekran çözünürlüğünün kaydedildiği bir dörtgen oluşturur. Program penceresinin, örneğin 180 piksel genişlik ve 200 piksel yükseklik, boyutları ise “this.ClientSize” özelliği ile belirlenir. En sonra komut satırı ise program penceresinin sol üst köşesinin masaüstünün neresine yerleştirileceğini belirtir. Bu satırın tercümesi ise, “monitör çözünürlüğünün sağ kenarının x koordinatını bul ve bundan 189 piksel çıkart” şeklindedir. Y koordinatı olarak da monitörün üst sınırı kullanılır. Ardından EventHandler “yukle()” yöntemini çalıştırır. 5 I Outsourcing: Harici kod dosyalarındaki komutların çağrılması Kaynak kod içerisinde kullanılan “yukle()” yöntemi çalışmayı paylaştırır. Daha önce de söylendiği gibi bir web sayfasının açılması ve değerlendirilmesi ile ilgili komutlar ayrı kod dosyalarında saklanıyorlar. Her bir harici C# dosyası iki yönteme sahiptir. Örneğin, Chip Online web sayfası ile ilgilenen dosya “MyGetWebChip(string url)” ve “DegerlendirChip();” yöntemlerine sahiptir ve her bir yöntem aynı isimli bir sınıf içerisine yerleştirilmiştir. Söz konusu yöntemler farklı bir dosya içerisinde bulundukları için başka bir çağırma komutu gereklidir. Şu ana kadar bu yöntemleri çalıştırmak için “yukle()” yazmak yeterliydi. Buna karşılık “DegerlendirChip();” yöntemi için aşağıdaki C# komutlarının kullanılması çalışmanızı kolaylaştırır: MyGetWebChip Chip_Temiz = new _ MyGetWebChip(http://www.chip.com.tr); DegerlendirChip Chip_Degerlendir = new DegerlendirChip(); İlk satırdaki eşit işaretinin önündeki “Chip_Temiz”, “MyGet- WebChip” sınıfının instance’ı olarak oluşturulmuştur ve (eşit işaretinden sonra) “MyGetWebChip(string url)” yöntemini çağırmak olan amacı bildirilmiştir. Burada “String” (Karakter katarı) olarak web sayfasının URL’si yönteme bildirilir. İkinci kod satırı ise analog olarak “DegerlendirChip()” yöntemini çalıştırmaktadır. 6 I Dış Dünya: Dosya ve web sayfalarına erişme kodları Şimdi ayrı kod dosyalarına atladığınız zaman şu durumla karşılaşacaksınız. “My GetWebChip(string url)” yöntemi, çağrılacak olan web sayfasının URL’sini karakter katarı olarak ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I 3 Dosya erişimi: FileStream•name•=•new• FileStream(Dosya,•Mod,• Erisim); Mod, dosyanın yeni mi oluşturulacağı- nı, geliştirileceğini veya açılacağını belirtir. Erişim, dosyayı okuyacağınızı mı yoksa değiştireceğinizi mi bildirir. 3 Internet erişimi WebRequest•name•=• WebRequest.Create(URL) İstenen bir web sayfası için sorgu baş- latır. Web adresi, parametre olarak parantezler içerisinde verilir. 3 While Döngüsü: while(sart){ İKomutlar> } Şart sağlandığı (mantıksal olarak doğ- ru) sürece sivri parantezler arasındaki komutlar çalıştırılır. k alır. İlk satırlarla iki tane String değişken oluşturulur: “Dosya” ismindeki ilk değişken alınan bilgilerin hangi dosyaya yazılacağını ileride araca bildirir ve ikinci string değişken ise bir tampon hafıza olarak kullanılır. Aşağıdaki kod satırları, aracın dosyalara ve web’e açılmasını sağlar: try { FileStream nereye = new FileStream(Dosya, System.IO.FileMode. _ Create, System.IO.FileAccess.Write); StreamWriter yaz = new StreamWriter (nereye); Yukarıdaki satırlar programınızın, muhtemel hataların tespit edildiği “try … catch” bloğuna gömülü olarak “testchip.txt” dosyasına yazma erişimi hakkına sahip olmasını sağlar. “nereye” ismindeki “FileStream” ilk kod satırında dosyayı (testchip. txt) oluşturur (Create) ve bu dosyaya yazma erişimini (Write) üzerine alır. Bir sonraki komutla, verileri dijital bir kalem gibi “testchip.txt” dosyasına kaydeden “yaz” adında bir “StreamWriter” oluşturuluyor. Sonraki üç komut ise web erişimini kontrol ediyorlar: Encoding encoding = System.Text.Encoding.GetEncoding(“utf-8”); WebRequest request = “WebRequest.Create(url); WebResponse response = request.GetResponse(); İlk olarak web sayfasının hangi karakter cümlesinde okunması gerektiği, burada “utf-8” belirlenir. Ardından kaynak tespit edilir. Buradaki “WebRequest” için bir internet sayfası gereklidir. Bunun için hangi sayfanın kullanılacağı ise komutun parantezleri arasında görülür. Buradaki (url”) ifadesi “MyGet- WebChip” yöntemi ile daha önce girmiş olduğunuz String değişkenidir. Son satır “WebResponse” sınıfının bir instance’ını oluşturur ve bu sayede programınızı ile web sayfasında aldığı cevapları düzenleyebilir. Takip eden kod parçası ile de söz konusu düzenleme işlemi organize edilir. StreamReader reader = new StreamReader _ (response.GetResponseStream(), encoding); str = reader.ReadLine(); Yukarıdaki “reader” adındaki “StreamReader” içerisinde şu ana kadar yapılanlar bir araya getirilir. Bu, web sayfasından daha önceden tanımlanan dil ile (“utf-8”) alınan cevabı kaydeder. Program şimdi bir sonraki komut ile “reader”ın ilk satırını diğer bir string içerisine kaydeder ve bu karakter katarında şimdi aşağıdaki “while” döngüsü çalışır: While (str != null) { … (Direktişer) str = reader.ReadLine(); } Yukarıdaki kod, döngünün “reader” stringinin ilk karakterinden başladığı ve daha sonra programın “reader”ın bir sonraki satırını okuduğu anlamına geliyor. Okuma işlemi, söz konusu satır karakter içerdiği sürece de devam eder. 7 I Arama fonksiyonu: Programın web sayfasındaki haberleri bulması İlk olarak tabii ki “while” yapısı içerisindeki direktişer çalıştırılırlar. Haber toplayıcısının “devamı” kelimesini araması ise tamamen web sayfasının yapısı ile ilgilidir. Chip Online Türkiye’nin web sayfasında yazılar sadece bir başlıktan meydana gelmezler. Ana sayfadaki haberler ek olarak yazının tamamını 176 CHIP | KASIM 2003 C# ile Programlama GÜNCEL » KAPAK » DONANIM » YAZILIM » HI-TECH » PRATİK » INTERNET ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I___ ___+___+___+___ ___C___#___ ___K___O___M___U___T___L___A___R___I 3 Dinamik Dizi: System.Collections.Array List•name•=•new• ArrayList(); Dinamik bir diziye devamlı olarak yeni değerler ekleyebilir veya çıkartabilirsiniz. 3 String’in bir kısmının silinmesi StringName•=•StringName. Remove(Üst,•Alt); String’in, belirtilen başlangıç ile bitiş konumu arasındaki kısmını siler. Başı ve sonu tamsayı türündeki değerlerdir. 3 String içerisinde arama Integer•= StringName. IndexOf(“Aranan“); Belirli bir karakter dizisinin string içerisindeki konumunu bulur. IndexOf, tamsayı cinsinde (Integer) bir değer geri döndürür. ___Bİ___T___Mİ___f___i___ ___P___R___O___G___R___A___M Visual Studio .NET: CHIP BAR projesinin kaynak kodunu Visual Studio .NET ile açabilir ve istediğiniz değişiklikleri yapabilirsiniz. k 178 CHIP | KASIM 2003 C# ile Programlama GÜNCEL » KAPAK » DONANIM » YAZILIM » HI-TECH » PRATİK » INTERNET işaret eden “devamı” adında bir bağlantıya sahiptirler. Tüm bu parçalar sayfanın HTML kodundaki bir satır içerisinde tutulurlar. Bu, www.chip.com.tr HTML metninde “devamı” kelimesi ile karşılaşılan satırda ayrıca bir makale bulunduğu anlamına gelir. Regex reg = new Regex (“devamı”); Match mat = reg Match(str); if (mat.Success == true) yaz.WriteLine(str); İlk satırda “reg” adında bir “Regular Expression” (Regex) oluşturuluyor ve buna “devamı” stringi atanıyor. Eğer karakter katarları içerisinde belirli ifadeleri aramak istiyorsanız Regular Expressions birinci sınıf bir araçtır. Program, söz konusu arama işlemini bir sonraki satırda çalıştırır. Burada “mat” ismini alan “Match”, söz konusu Regular Expression’ın belirli bir string içerisinde olup olmadığını kontrol eder. Eğer “mat”, “str” stringi içerisinde “devamı” kelimesini bulursa takip eden “if ” koşul ifadesi çalışır. Ancak olumlu bir sonuç elde edildiği zaman ilgili satır “testchip.txt”metin dosyasına yazılır. 8 I Ayrıntı: Karakter katarları ve dinamik diziler “MyGetWebChip” yöntemi web sayfasındaki önemli satırları” testchip.txt” metin dosyasına yazdıktan sonra program, bu satırdan iletinin başlığını ve ilgili makalenin bulunduğu URL adresini ayırmalıdır. Bu,“DegerlendirChip” yönteminin görevidir. Ve bu, “MyGetWebChip” yöntemine bağlı olarak analog çalışmaktadır. Bu, “testchip.txt” dosyasına erişimi organize eder ve daha sonra “chip.txt” adında yeni bir dosya oluşturur. Ardından “testchip.txt” dosyasındaki bilgileri okur ve daha sonra bunları bir “while” döngüsü içerisinde düzenler. Ancak burada önemli bir fark söz konusudur: System.Collections.ArrayList ileri = new ArrayList(); Yukarıdaki kaynak kod yardımıyla “ileri” adında bir dinamik dizi oluşturulur. Diziler, içerisinde çok sayıda değişken saklayabileceğiniz bir listelerdir. Ancak yukarıda tanımlanan dizinin özelliği, bir sonraki adımda tüm yazı başlıklarının ve web adreslerinin saklanmasıdır. Karakter dizileri “tmp” adındaki string’e kaydedilirler. Şimdi söz konusu string’i parçalarına ayırmalısınız. İlk adım: Makalenin URL’sine ait tüm karakterlerin ayrılması. tmp = tmp.Remove(0, (tmp.IndexOf(“href=”) + 6)); Yukarıdaki kodun açıklaması ise şu şekildedir: Takip eden “tmp” string’i, o anki güncel “tmp” string’indeki “0” konumundan itibaren “href=” ifadesine kadar olan tüm karakterler silinerek (Remove) oluşturulur. Buradaki “tmp.IndexOf(“ href=”) söz konusu “href=” ifadesinin string içerisinde ilk bulunduğu yeri tespit eder. Ancak bu programın bu bölümü (bir karakter fazlasını) de silmesi gerektiği için söz konusu değer “6” artırılır. Ardından elde edilen web adresi “url” string’ine kaydedilebilir: url = + tmp.Substring(0, (tmp.IndexOf(“html”) + 4)); Bir substring, tüm string’in sadece bir parçasından başka bir şey değildir. Burada ise satırın başlangıcından (0) “html” ifadesinin ilk karşılaşıldığı yere kadar olan kısmı içerir. Ancak “html” ifadesi henüz URL’ye dahil olduğu için buradaki “IndexOf(“ html”) sonucunda elde edilen değer “4” artırılır. Harbe toplayıcı aracımız söz konusu prensibi kullanarak makale başlıklarını da HTML kodundan ayırır ve bunları “news” adındaki string içerisine kaydeder. Artık bu kayıtları “ileri” ismindeki dinamik dizi içerisine eklemelisiniz: ileri.Add(news); ileri.Add(url); Yukarıdaki satırlar “ileri” dinamik dizisine iki kayıt eklerler (add). Bunun için ilk olarak haber, daha sonrada ilgili makaleye ait web bağlantısı saklanır. 9 I Çıktı: İstenen haberler için yeni bir pencere Program, web adreslerini ve başlık satırlarını titiz bir şekilde kaydettikten sonra hiçbir şey yapılmaz. Yeni bir makale tespit edildiği zaman ana pencerede ekrana getirilir fakat daha başka bir işlem gerçekleştirilmez. Ancak düğmelerden bir tanesine tıklandığında çalışma başlar. Bunun sonucunda internet sayfasındaki gerçekten en yeni bilgileri alabilmek için bir EventHandler, örneğin “Chip- Logo_Click” işleme sokulur ve ardından “MyGetWebChip” ve “ChipDegerlendir” yöntemleri çalıştırılır. Daha sonra EventHandler aşağıdaki komutlar yardımıyla yeni bir pencere açar: Newspencere newspencere = new Newspencere (3, x, y); Çalıştırılan “Newspencere” yöntemi bunun için üç tane değişken alır. İlk değişken olan “3” hangi logonun tıklandığını yani hangi haberlerin değerlendirileceğini belirtir. Diğer iki değişken ise küçük haber penceresinin, ekrandaki ana pencerenin ne tarafında görüntüleneceğini gösterir. Bu sayede haber penceresi bir Docking etkisi gösterebilir ve her zaman ana pencerenin kenarında ekrana gelir. Haber penceresi, üzerinde istenen web sayfasına ait on tane güncel haberin ve ilgili URL’lerin görüntülendiği “Cikti” isminde bir “RichTextBox” kutusundan başka bir şey değildir. Programın ekran çıktısındaki sonuçların sayısını istediğiniz gibi değiştirebilir veya aracın kaynak kodunu geliştirerek başka sayfaların da incelenmesini sağlayabilirsiniz. _ MS / Kadir Tuztaş, ktuztas@chip.com.tr C# atölye dizisinin 1. bölümünü ve her iki bölüme ait kaynak kodları www. chip.com.tr/csharp’te bulabilirsiniz. »3 ADIMDA KOLAY ÇÖZÜM 180 |
Cep telefonları |
Ekran kartları |
Masaüstü |
Notebook |
Ses kartları |
Webcam |
Klavye & Fare |
Yazıcılar |
Tablet
Ev Sineması
Mp3 Player | Usb Bellekler | Video kameralar | Fotoğraf Makinesi | Taşınabilir diskler | LED & LCD Tv | Monitörler | OEM | PDA
Navigasyon | Oyun Konsolu

