tag:blogger.com,1999:blog-77688381265394320162008-07-19T00:08:01.707-07:00--- SelamlaR ---z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-7768838126539432016.post-13168475022786879332008-07-10T04:23:00.000-07:002008-07-11T18:59:35.123-07:00C# ile Spider (Crawler - Web Örümcek) Örneği Bölüm 1Uzunca bir aradan sonra yeniden birlikteyiz. Bu makalemizde kendimizce yazdığımız bir spider namı diğer web crawler göstereceğiz. Programımızın içeriği şu olacak: Belirlediğimiz alışveriş siteleri için programı çalıştıracağız, sonra oturup bir çay içeceğiz. Biz çayımızı yudumlarken programımız örneğin <a href="http://www.hepsiburada.com"><font color="blue">hepsiburada.com</font></a>'a gidip, site içinde ne kadar ürün varsa hepsini bizim için programımızdaki veritabanına atacak. Bu işi yapan bir site de mevcut: akakce.com. Biz de acaba yapabilir miyiz diyerek oturup kendi masaüstü programımızı yazdık. Ancak makaleyi 3 parçaya bölmek istiyoruz. Birinci bölümde Türkçe fazla kaynak bulunmayan Regular Expressions yani Düzenli İfadeleri anlatmaya çalışacağız. Kendi çapımızda öğrendiğimiz şeyleri sizlerle paylaşmak isteriz. Herkes paylaşırsa Türkçe kaynak kıtlığı çektiğimiz bu konuda oldukça fazla ilerlemeler sağlayabiliriz. Düzenli İfadeler (Regex) hakkındaki yazımızı görmek için <a href="http://zburakguven.blogspot.com/2008/07/c-ile-spider-crawler-web-rmcek-rnei-blm.html">burdan devam edebilirsiniz.</a> <span id="fullpost"><br /><br />Regular Expression yani Düzenli İfadeler belli bir kaynak metin içinde istediğimiz karakterlerin olup olmadığını kontrol eden bir çeşit dildir. Kendine has düzenleme ifadeleri, dil kuralları vb. özellikleri vardır. Düz bir metin için bir desen belirleriz ve o metinin içinde belirlediğimiz desenlere uyan eşleşmeler olup olmadığına bakarız. Peki bu bizim projemizde ne işe yaramıştır ? <br /><br />Bir spider ya da Türkçesiyle örümceğin çalışma mantığını şu şekilde özetleyebiliriz: Programımız bir web sitesine girer. Web sitesinde, o an gezilen sayfadaki linkleri kontrol eder ve link bulursa bu linkleri daha sonra ziyaret etmek üzere hafızasına kaydeder. Sonra sırasıyla linkler taranarak, web sitesinde hiç link kalmayıncaya kadar bu işleme devam edilir. İşte burada bir web sayfasını gezerken sayfada link olup olmadığını anlamak için bir düzenli ifade kullanmayı tercih ettik. Ancak bu işlem için .net ortamında c#'ın bir sınıfı olan htmldocument da kullanılabilir. Programın hem hızlı çalışması için ve hem de maksat daha fazla bilgi paylaşımı olduğu için düzenli ifadeleri kullanmayı tercih ettik. <br /><br />Artık düzenli ifadelerle ilgili minik örnekler vermeye başlayabiliriz. En baştan söyleyeyim, türkçe karakterler için düzenli ifadeler sıkıntı yaşatıyor. En azından ben biraz sıkıntı çektim. Ama bu şu an bizim için sorun değil çünkü sitelerin linklerinde Türkçe karakter (maalesef) bulunmuyor. En basitiyle bir düzenli ifade gösterecek olursak, örneğin araba kelimesi içindeki a harfini bulmak için [a] yazmamız yeterli olacaktır. Burada [a] bir desen oluyor. Aslında '[' ve ']' işaretlerini de koymanıza gerek yok. Bunlar yerine '(' ve ')' kullanabiliriz. Bu şekilde sadece 'a' harfini eşlemiş oluruz. Bunun yanında (ab) yazarsak ar<font color=red>ab</font>a eşlenmiş olur. Ama bir an önce ilerlemek için [a] yazmakta fayda var. Daha farklı bir örneği de şu şekilde verebiliriz: örneğin tek[ie]r ifadesini bir metin içinde kullanırsak, bu durumda tekir veya teker kelimelerini eşleyebiliriz. Peki elimizde birden fazla e harfi olursa? örneğin tek[e]{1,5}r deseni teker, tekeer, tekeeer, tekeeeer ve tekeeeeer kelimelerini eşleyebiliriz. Burada {1,5} ifadesinin {min,mak} değerlerine karşılık geldiği sanırım anlaşılmaktadır. {}Parantezleri yerine kullanılabilecek bir ifade de, * (yıldız) veya + (artı) 'dır. Bu karakterlerden * (yıldız) , kendinden önceki karakterin olmaması veya birden fazla olması anlamına gelmektedir. Örneğin ara(ba)* desenini kullanacak olursak, ara, araba, arababa, arabababa kelimelerini eşleyebiliriz. Burada (ba) ifadesi olsa da eşleme yapılır, olmasa da. Ancak + (artı) işaretinde durum biraz farklıdır. + karakterinin önündeki ifade, aranacak kelime içinde en az bir kez mutlaka geçmelidir. Aksi takdirde eşleme yapılmaz. Az önceki örneğimizde <br />ara(ba)+ desenini kullanırsak, araba,arababa,arabababa eşlenir, ancak ara eşlenmez çünkü (ba) en az bir kez tekrar etmemiştir. <br /><br />İşler bu şekilde yolunda giderken, farzedin ki bir site yapmaya başladınız ve üyelik sisteminiz var. Kullanıcı kaydı yaparken bir e-posta hesabı talep ediyorsunuz. İyi niyetli kullanıcımız, e-posta adresini girerken "@" karakterini eklemeyi unuttu. Peki şimdi ne olacak ? Bu tip durumlarda internette yüzlerce örneğine rastlayabileceğiniz hazır desenler mevcut ama biz kendimizin ki yazmaya çalışalım. Öncelikle bir e-posta adresini göz önünde bulunduralım: abc@def.com . E-posta adresi temel olarak 3 kısımdan oluşur ki bu kısımlar kullanıcı adının bulunduğu kısım, "@" karakteri ve domain ismidir. Burada kullanıcı adı abc, domain ismi de def.com 'dur. Ancak bildiğimiz üzere e-posta adresleri sadece harflerden oluşmamaktadır. Farzedelim ki abc_DEF-85@xyz.com şeklinde bir e-posta adresimiz var. Şimdi burada desenimizi adım adım oluşturalım. İlk olarak [a-z] yazalım. Burada bir adım daha öne gittiğimizin farkına varmışsınızdır: [a "-" z] burada "-" işareti "a ve z karakterleri arasında kalan tüm karakterleri al" anlamına gelmektedir. Yani ister abc olsun, ister str olsun, yeter ki küçük harf olsun tüm karakterler eşlenecektir. Bir sonraki adım büyük harfleri eşlemek olsun. Bu durumda küçük harfler için yaptığımız şeyin aynını büyük harfler için yaparız: [a-zA-Z]. İşte bu kadar. Sayıları eşlemek için de aynı şeyi yapabiliriz: [a-zA-Z0-9] dersek küçük harf, büyük harf veya rakamlar eşlenebilir. ANCAK BURADA DİKKAT EDİLMESİ GEREKEN ŞEY; bu desen sadece tek bir karakter eşleyebilecektir. Bir tekrar söz konusu değildir. tekrarı sağlamak için + karakterini kullanmak zorundayız. Yukarda belirttiğim gibi, +, kendinden önceki karakterin en az bir kez olmasını gerektirir. Desenimizin son hali, [a-zA-Z0-9]+ şekline gelmiş olur. Ancak e-posta adresimizde -(tire), _ (alt çizgi) gibi karakterler de bulunmaktadır. Bu karakterleri eşlemek için de, desenimizdeki harf grubuna ekleme yapmamız gerekir:<font color="red"> [a-zA-Z0-9-_]+</font>. Evet, şimdiye kadar "@" karakterinden önceki tüm karakterleri eşlemiş olduk." @ " karakterini kontrol etmek için ise desenimize sadece "@" eklemek yeterli olacaktır: <font color="red"> [a-zA-Z0-9-_]+@</font>. Bu şu anlama gelmektedir: Verilen metin içinde, "@" karakterini görünceye kadar tüm karakterleri oku, "@" karakteri okuduğunda karakter okumayı durdur. Şimdi de domain ismini okumaya başlamalıyız. Kullanıcı isminde olduğu gibi karakter okuma işlemini devam ederiz, ancak burada ".com, .net, .tr" gibi ifadeler olabilir. Bu durumda desenimizi şu şekilde düzenlersek sorunumuz çözülmüş olacaktır: <font color="red"> [a-zA-Z0-9-_]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}</font>. ".(nokta)" karakteri, düzenli ifadeler için özel bir karakter olduğundan \. ile belirtilmek zorundadır. Ancak kod yazarken derleyici kurallarına da dikkat etmek zorundasınız. örneğin \. ifadesini C#'ta belirtmek için \\. ifadesi kullanılır çünkü "\" karakteri de C# için özel bir karakterdir. Evet görüldüğü gibi temel anlamda, e-posta adresi kontrolü yapan bir desen düzenlemiş olduk. <br /><br />Şimdi dilerseniz visual studio'nun bize sağladığı bir güzellikten de biraz bahsedelim: Validators (Doğrulayıcılar). Visual Studio ortamında proje geliştirirken, bu tip e-posta, telefon numarası gibi kontrolleri yapmak için kullanabileceğimiz hazır bileşenler mevcuttur. Yeni bir web sitesi projesi oluşturarak işe başlayalım. Daha sonra sayfamıza bir textBox ve bir de Label ekleyelim. Son olarak da, araç kutusundaki Validation sekmesinden, regular expression validator bileşenini sayfamıza sürükleyip bırakalım. Sayfamızın son hali aşağıdaki gibi olsun: <br /><a href="http://bp2.blogger.com/_LBrNwSktDyg/SHcRN36ypcI/AAAAAAAAACg/TbqlNO_0TYk/s1600-h/vl2.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_LBrNwSktDyg/SHcRN36ypcI/AAAAAAAAACg/TbqlNO_0TYk/s320/vl2.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5221661223005889986" /></a><br /><br />Şimdi bir e-posta doğrulaması yapmaya çalışalım. Resimde görülen adımları sözlü olarak anlatmakta da fayda var. Öncelikle doğrulayıcı nesnemizin özelliklerine girerek, doğrulama işlemi yapılacak olan kontrol belirlenir ki bu özellik <strong>ControlToValidate</strong>'tir. Ardından doğrulama işlemi gerçeklenmediğinde ekranda gösterilecek olan hata mesajı girilir. Son olarak da ne tür bir doğrulama uygulayacağımız <strong>ValidationExpress</strong> özelliği ile seçilir. Seçim işlemini resimden görmek de mümkün. Örneğimiz gereği biz bir İnternet Email Adresi regexini seçtik ve visual studio bizim için <font color="red">\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</font> düzenli ifade desenini (regex) üretti. Yukarıda anlattıklarımıza paralel bir desenle karşı karşıyayız. Burada "w" karakteri, her türlü metin karakterini temsil etmektedir. Bu harf yerine \s de kullanılabilmektedir. Bu tür kısaltmalara nette yapılacak küçük bir araştırmayla ulaşabilirsiniz. <br /><br /><a href="http://bp2.blogger.com/_LBrNwSktDyg/SHgJRlf2GPI/AAAAAAAAACo/nQ48sip62ss/s1600-h/vl1.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_LBrNwSktDyg/SHgJRlf2GPI/AAAAAAAAACo/nQ48sip62ss/s320/vl1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5221933965664196850" /></a><br /><br />Örneğimizi çalıştırıp yanlış bir email adresi girdiğimizde aşağıdaki resimdeki gibi bir durumla karşılaşırız: <br /><br /><a href="http://bp1.blogger.com/_LBrNwSktDyg/SHgJu3eQdnI/AAAAAAAAACw/X2p8cnQCXD0/s1600-h/vl1.bmp"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_LBrNwSktDyg/SHgJu3eQdnI/AAAAAAAAACw/X2p8cnQCXD0/s320/vl1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5221934468705580658" /></a><br /><br />Çeşitli örnek desenler için, visual studio'daki validator nesnesinden yararlanabilirsiniz. Şimdi artık düzenli ifadeleri bizim projemizde ne aşamada kullandığımızı anlatmanın zamanı geldi sanırım. Projemiz www.abc.com sitesine girdiğinde aslında tek yaptığı şey, www.abc.com html dokümanını alıp gelmektir. Biz bu html dokümanını kullanıcıya göstermek yerine, kendimiz arka planda işlemeye çalışıyoruz. Peki bu işlemeden kastımız nedir ? Kastımız bildiğimiz dosya okuma işlemidir. Sorgu gönderdiğimiz (Request ettiğimiz) sayfayı satır satır okuma işlemini gerçekleştirirken, html linklerini bulan bir desen yardımıyla, sayfa üzerinden diğer sayfalara verilmiş olan linkleri toparlayabiliyoruz. Bu işlemi <font color="red">href="[a-zA-Z0-9=:/.?&-_+;][^"]+</font> düzenli ifadesiyle veya daha kolay olarak <font color="red"> href=.[^"]+</font> şeklinde gerçekleştirebiliriz. Burada amacımız, eğer elde ettiğimiz html dokümanındaki o an okuduğumuz satırda href=" ile başlayıp '"(çift tırnak)' işaretiyle biten yazıları belleğe almaktır. Malumunuz htmlde linkler <font color="blue"><a href="abc.aspx"></a></font> formatındadır. Biz burada minimum deseni oluşturmaya çalıştığımız için href ile başlayan kısımdan href'in son çift tırnağına kadar olan veriyi almak yeterli oldu. <br /><br />Evet, bu yazımızın amacı, düzenli ifadeler (regular expressions) hakkında küçük de olsa bilgi verebilmekti. Ben konuyu öğrenmek için <a href="http://www.regular-expressions.info/">regularexpression.info</a> sitesine sık sık başvurdum. Çeşitli online desen test eden yerler var, bunlardan biri de <a href="http://regexlib.com/RETester.aspx"> ReTester</a> Umarım konuyla ilgili olanlara bir faydam dokunur. Paylaşımı artırmak için, yorumlarda soru cevap ortamının oluşmasını ümit ediyorum. İkinci bölümde görüşünceye kadar, herkese iyi çalışmalar...<br /></span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-82802368738315506942008-01-05T19:33:00.000-08:002008-01-05T19:38:52.231-08:00AŞKA VE TERKE DAİR<a href="http://zburakguven.blogspot.com/2008/01/aska-ve-terke-dair.html">Aska Ve Terke Dair... -CAN DÜNDAR- <br /></a><span id="fullpost"><br />Bazen öyle bir iliskiye tutulursunuz ki, ne sevebilir,ne<br />terkedebilirsiniz. Kör kütük baglanmissinizdir aslinda... En güzel<br />yillarinizin, aci tatli hatiralarinizin ortagidir; iç çekismelerinizin<br />müsebbibi, yazilarinizin ilhami, sohbetlerinizin konusudur. Gözyaslarinizda,<br />bilinçaltinizda, kahkahanizdadir. Korkunca saklandiginiz bir siginak,cosunca<br />öptügünüz bir bayrak...Sevdaniz riyasiz, çikarsiz, karsiliksizdir.Sinirsiz<br />ve nihayetsiz;<br />"Ölmek var, dönmek yok"tur.<br /> * * *<br />Lakin gün gelir anlarsiniz; içten içe bir seylerin kanadigini...<br />Tutkulu sevdalarin gizli hançerleri baslar parildamaya...Surasindan,<br />burasindan elestirmeye koyulursunuz:<br />"Söyle görünse, öyle demese, degisse biraz ya da eskisi gibi olsa..."<br />Baskalarini örnek göstermeye, "Bak onlar nasil yasiyor" demeye<br />baslarsiniz. Hem birlikte yasayip, hem özgür olmanin yollarini ararsiniz.<br />Askinizin gözü kör degildir artik, yanlisini görür düzeltmek istersiniz.<br />"Eskiden böyle miydi ya.." diye baslayan sohbetlerde<br />açilir elestirinin kapisi; açildikça, bastirilmis itirazlar yükselir<br />bilinçaltindan... Böyle süremeyecegini bilirsiniz. Degissin istersiniz.<br />O, sevgisizliginize yorar bunu... Ihanete sayar. Tutkulu iliskilerde<br />ihanetin bedeli ölümdür. "Ya sev böyle ya da terket" diye gürler...<br /> * * *<br />Bir zamanlar bir gülücügüyle alacakaranligi isitan o rüya, bir kabusa<br />dönüsür birden... Kapatir gönlünün kapilarini, yasaklar kendini size...<br />Hoyrattir, bakmaz yüzünüze... Zehir akar dilinden, konusturmaz,<br />suçlar,yargilar mahkum eder. Mühürler dudaklarinizi, yirtar atar<br />yazdiklarinizi, siler sizi defterden... "Iyiligin içindi hepsi, seni<br />sevdigim için..." dersiniz,dinletemezsiniz. Ayrilirsaniz asamayacaginizi<br />bilirsiniz, lakin böyle de sevemezsiniz. Ihanetten kirilmistir kaleminiz;<br />severek, terk edersiniz...<br /><br />* * *<br />"Madem öyle..."nin çagi baslar ondan sonra...Madem ki siz böylesine<br />tutkunken, o hep baskalarini seçmistir, madem ki kiymetinizi bilmemistir, o<br />halde "günah sizden gitmistir". Lanet ederek bu karsiliksiz aska, çekip<br />gitmeleri denersiniz. Askin göçmenlik çagi baslar böylece... Daha özgür<br />olacaginiz limanlara demirlerseniz bir süre... Ne var ki unutamaz, uzaktan<br />uzaga izlersiniz olup biteni... Etrafi bir sürü ugursuzla dolmus, kurda kusa<br />yem olmustur. Deli kanlilar, eli kanlilar, ugruna ölenler, sirtina binenler<br />sarmistir<br />çevresini... Gurur duyar onlarla, koynunda besler, gözünü oysunlar<br />diye... Ugruna kan dökenleri sever, yoluna gül dökenlerden fazla... "Bana<br />ne... kendi seçimi" diye omuz silkmeye çabalarsiniz bir süre... Ama sonra...<br />ansizin kulagimiza çalinan bir sarki ya da kapi araligindan süzülüp gelen<br />bir koku, hatirlatir onu yeniden... Yaban ellerde,<br />baska kollarda ondan bahseder aglarsiniz. Kokusunu özlersiniz; türküsünü<br />söylemeyi, sarkisini dinlemeyi, yemegini yemeyi, elinden bir kadeh<br />raki içmeyi... Karsi nehrin kenarindan hasret siirleri haykirirsiniz, sular<br />kulagina fisildasin diye...<br />Dönüp "Seni hala seviyorum" diye bagirmak geçer içinizden...Dönemezsiniz.<br />Göremedikçe baglanir, uzaklastikça yakinlasirsiniz.<br /><br /> * * *<br />Anlarsiniz ki bir çaresiz asktir bu, ne onunla olur, ne onsuz... Hem<br />kollarinda ölmek, kucagina gömülmek arzusu, hem "Ne olacak<br />sonunda"kuskusu... Böyle sevemezsiniz, terk de edemezsiniz. Sürünür<br />gidersiniz...<br /><br /></span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-33261948091049857452007-10-18T06:23:00.000-07:002008-01-05T19:39:00.958-08:00explorer ana sayfa değişmiyor...arkadaşlar tekrar merhaba... internet explorer'da kafama göre takılırken birden bir reklam penceresi açıldı, tam kapatayım derken optik farenin azizliği reklama tıklamış bulundum... olan oldu... explorer'ın ana sayfası kilitlendi, istemediğim sayfalar karşıma üçer beşer çıkmaya başladı, canıma tak etti! yapılacak çok fazla bişey yoktu aslında kayıt defterinde bi kaç yeri değiştirsek sanırım <a href="http://zburakguven.blogspot.com/2007/10/explorer-ana-sayfa-deimiyor.html"> çözüme ulaşmış olurduk... </a><br /><span id="fullpost"><br /><font color="red"> başlat-> çalıştır-> regedit </font> diyip kayıt defterimize girdikten sonra <font color="red">HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main </font> kısmındaki <font color="red"> start page </font> değişkeninde yazan değerin istemediğiniz site olduğunu zaten görürsünüz. artık yapmamız gereken o değerin yerini boş bırakmak ya da herhangi bir internet adresi yazmak. ilk çıkan zararlılar bunu yapınca hemen çözülüyorlardı. bir sonraki nesilin hakkından; bu adımlara ek olarak <font color="blue">www.google.com</font> sitesindeki en aşağıda bulunan <font color="blue">Google'ı Başlangıç Sayfanız Yapın!</font> linkine tıklayarak gelebiliyorduk. artık bu da işe yaramıyor ama demokraside çareler tükenmez... <font color="red"> HKEY_CURRENT_USER \ SOFTWARE \ Policies \ Microsoft \ Internet Explorer \ Control Panel</font> kısmındaki <font color="red">Home Page</font> değişkenini <font color="red">0</font> olarak değiştirirsek sorunumuz çözülmüş olacaktır. Herkese mutlu günler...</span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-56367863508698059652007-10-17T14:21:00.001-07:002007-10-18T06:22:46.774-07:00windows başlarken numlock çalışmıyorsaarkadaşlar saçma sapan bir bilgi gibi gelebilir ama eminim aranızda windows başlarken numlock ışığının yanmamasına sinir olanlar olmuştur. <a href="http://zburakguven.blogspot.com/2007/10/windows-balarken-numlock-almyorsa.html"> buyrun burdan devam edelim...</a><br /><span id="fullpost"><br />şimdi öncelikle denenmesi gereken bir kaç yol var, başıma geldiğinde çözmek için adım adım bazı şeyleri uyguladım. üzerinde numlock ayarı tutan bioslar var, ama bioslar bilgisayardan bilgisayara fark edeceğinden ben xp işletim sistemi üzerinde yapılabilecekleri anlatayım... <font color="red"> başlat -> çalıştır -> regedit </font> yazıyoruz ve kayıt defterimize giriyoruz. buradan sonra <font color="red"> HKEY_CURRENT_USER\Control Panel\Keyboard kısmındaki InitialKeyboardIndicators </font> değişkenimizin değerini 0 veya 1 'se 2 olarak değiştiriyoruz. hala sorun giderilmediyse bu sefer <font color="red"> HKEY_USERS\.DEFAULT\Control Panel\Keyboard kısmındaki InitialKeyboardIndicators </font> değişkeninin değerini yine 0 veya 1 se 2 olarak değiştiriyoruz. böylece sorunumuz çözülmüş oluyor (tabi sorun windows'tan kaynaklanıyorsa...) eğer başka bir sorun varsa daha detaylı işler yapmak gerekebilir... Herkese iyi çalışmalar dilerim, görüşmek dileğilye. Hoşçakalın.<br /></span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-29993276268308468722007-09-24T01:20:00.000-07:002008-01-05T19:39:13.243-08:00kullanıcı mesajları için küçük enstanteneler...net 2005 te asp.net ile uğraşıyorsunuz ve kullanıcı mesajları başınıza dert mi oluyor ? o zaman birlikte <a href="http://zburakguven.blogspot.com/2007/09/kullanc-mesajlar-iin-kk-enstanteneler.html"><span style="color:blue;">devam edelim :)</span><br /></a><br /><span id="fullpost"><br />Bir profesyonel edasıyla sayfamızı oluşturuyoruz, herşey çok güzel çalışacak görünüyor ancak sevgili kullanıcıların bizimle aynı şeyleri düşünemeyeceğini mutlaka bir yerlerde bizim hesaplarımızın dışında işlemler yapmaya çalışacaklarını gözden kaçırmamamız gerekir...<br /><br />Bu ince noktaları yakalamamız kullanıcıların beğenisini daha çok kazandıracaktır ve çok olumlu geribildirimleri garantileyecektir. Bu uyarıları küçük detaylar olarak niteleyebiliriz ancak bütünün ayrıntılardan oluştuğunu unutmayalım..<br /><br />Sadede geleyim, asp.nette html kodlarıyla uğraşmaktansa code-behind da gerçekleştirmek bana daha yakın geliyor. bu sebeple javascript fonksiyonlarını örneğin butonların click olaylarına gömerek elde ettiğimiz mesaj veya onaylama kutularını daha kolay gösterebileceğimiz yolları izah etmeye çalışacağım..<br /><br />Örnek olarak stajyerlik kariyerimin zirvesinde gerçekleştirdiğim projeden alıntılar yapacağım :)Diyelim ki bir kayıt işlemi yapılıyor ve sayın kullanıcı null değeri alamayacak bir yeri boş bırakıp "kaydet" dedi, bu durumda onu bu konu hakkında bilgilendirmemiz gerekir ve (kaydet in buton olduğu farzediliyor) kaydet in click olayına örneğin proje adının boş bırakıldığı test edildikten sonra eğer boşsa;<br /><br /><span style="color:#ff0000;">Response.Write("<> alert('Proje ismini boş bırakmayınız..') < / script>");</span><br /><span style="color:#ff0000;"></span><br />kod satırıyla kullanıcı bilgilendirilir. Ekrana tamam butonunun olduğu bir mesaj çıkar ve kullanıcının geri dönerek istenileni yapması sağlanmış olur.<br /><br />Bir diğer ve önemli nokta ise onaylama mesajlarıdır, windows un tüm silme olaylarında da görebileceğiniz üzere kullanıcının silmekten emin olup olunmadığı sorulmalıdır çünkü yanlışlıkla basma v.s. gibi durumlarda geri dönüş olmalıdır.Aynı şekilde önemli verilerin kayıt işlemi esnasında verilerin gözden geçirilmesi de istenebilir. Benim vereceğim örnekte silme olayı datagrid üzerine konulmuş bir pushbutton ile gerçekleştiriliyor. Sağolsun .net bu işlem için datagrid in ItemDataBound olayını oluşturmuş :) bu olay yardımıyla silme işlemini kullanıcıya başarıyla onaylatabilirsiniz..<br /><br /><span style="color:#ff0000;">protected void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)</span><br /><span style="color:#ff0000;">{</span><br /><span style="color:#ff0000;">if (e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem)</span><br /><span style="color:#ff0000;">{e.Item.Cells[1].Attributes.Add("onclick", " return confirm ('Silmek Istediginizden Emin misiniz? ')");</span><br /><span style="color:#ff0000;">}</span><br /><span style="color:#ff0000;">}</span><br /><span style="color:#ff0000;">}</span><br /><br />burada e.Item.Cells[1].Attributes satırındaki [1] delete pushbutton'un bulunduğu kolon sırasına işaret etmektedir.<br /><br />Esenkalın...<br /></span>sevdalinkanoreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-43792204716999973982007-09-21T16:03:00.000-07:002007-09-23T18:17:11.678-07:00MAFIA 2Arkadaşlar yeniden merhaba. 06/01/2008 tarihinde (umarım değişmez) Mafia oyununun ikincisi çıkıyor: <a href="http://zburakguven.blogspot.com/2007/09/mafia-2.html"><font color="blue">MAFIA 2.</font></a> <br /><span id="fullpost"><br />Birinci oyun bence oynanabilirlik, kurgu ve görsellik olarak çok güzeldi. Ancak oynadığım en iyi fps GTA SAN ANDREAS. Bir oyun delisi olarak temennim san andreası aramamak. Godfather'ı da oynamıştım ama onu bitirdikten sonra nedense SAN ANDREAS'taki gibi bir haz duymamıştım. Mafia 1; san andreastan çok önce çıktığı için oyunun 2.'sinden beklentim çok büyük. Bu arada Gta da 4 numaralı oyunu piyasaya sürme hazırlığında. Şimdilik pc için düşünülmüyormuş ama düşünülmemesi için de bir neden yok sanırım... Mafia 2'de de birinci oyunda olduğu gibi ana karakter tommy imiş. Benim anladığım kadarıyla 2. oyun birincinin devamı olmasından ziyade yeniden bir kurgu tasarlanmış çünkü hatırladığım kadarıyla kahramanımız birinci oyunun sonunda mefta oluyordu :) oyunla ilgili yapımcı firmaların çok fazla açıklaması yok maalesef. Ancak birinci oyunu bir düşünürsek sistem gereksinimi olarak directx10 ekran kartı isteyecektir büyük ihtimalle ya da en iyimser yaklaşımla directx9.c olup minimum orta seviye bir ekran kartı desteği gerekecektir. bu kötü bir haber ama oyunun elime geçmesi benim için sistem güncellemeye yeter bir sebep :) lafı fazla uzatmayayım,zaten resimlere bakınca oyun tutkunu arkadaşlar benimle hem fikir olacaklardır :) <br /><a href="http://bp1.blogger.com/_LBrNwSktDyg/RvRSEgGRGJI/AAAAAAAAAA0/sY31c5E4rFc/s1600-h/02_x.jpg"><img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_LBrNwSktDyg/RvRSEgGRGJI/AAAAAAAAAA0/sY31c5E4rFc/s320/02_x.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112801714261530770" /></a><a href="http://bp2.blogger.com/_LBrNwSktDyg/RvRSNwGRGKI/AAAAAAAAAA8/h3Z8pbuzI8k/s1600-h/04_x.jpg"><img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_LBrNwSktDyg/RvRSNwGRGKI/AAAAAAAAAA8/h3Z8pbuzI8k/s320/04_x.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5112801873175320738" /></a><br />oyunun tanıtım videosuna <a href="http://www.youtube.com/watch?v=JroUUnVuHo0">buradan</a> ulaşabilirsiniz...<br /></span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-55490494417631191202007-09-18T17:28:00.001-07:002007-09-23T18:10:19.029-07:00c# ile Mail Atma Programıarkadaşlar bu programımızda kendimize ait web sitemizden mail göndermeye çalışacağız. Kullanacağımız dil asp. programı görmek için <a href="http://zburakguven.blogspot.com/2007/09/mail-atma-program.html"><font color ="blue">tıklayın</font></a><br /><span id="fullpost"><br />öncelikle şunu söylemek isterim, bu programı ben yaptıysam herkes yapabilir. web tabanlı programlama konusunda kendime güvenim hiç yok denecek kadar az. Bu da demek oluyor ki yapacağımız iş aslında zor değil. c# ile basit chat programı yazımızda olduğu gibi önce temel bilgileri vermeye çalışalım. daha önceki yazımda (chat programı) bilgisayarların birbirleriyle anlaşabilmeleri için bazı protokollerin kullanıldığını belirtmiştim. tcp/ip gibi. mail göndermek için de bilgisayarların birbirleriyle etkileşmesi gerektiği için bu iş için de bir protokol tanımlanması gerekiyor: smtp (Simple Mail Transfer Protocol - Basit Mail Gönderme Protokolü). Bu protokolü kullanmak için ise bir smtp server gereklidir. biz bir web sitesini herhangi bir sunucuda yayımladığımız zaman, siteden mail atabilmemiz için sunucunun smtp server'ının olması gerekir. ben bir site yayımlamadığım için, bunu gmail'in smtp server'ını kullanarak yapacağım. <br />gmail'in server'ını kullanmayı aşağıda zaten anlatacağım ancak benim gibi amatör ama meraklı arkadaşlar için birkaç cümle eklemek isterim. windows'un kendi smtp server'ı da mevcuttur. server'ı kurabilmek için windows xp cd'nizi takıp denetim masası->program ekle/kaldır-> windows bileşenlerini ekle/kaldır sekmesini tıklayarak karşınıza çıkan menüden internet information services (iis) kutucuğunu işaretleyip ileriyi tıklamalısınız. smtp server iis içindedir. daha sonra iis ayarlarınızı yaparak tasarladığınız web sitenizi kendi bilgisayarınız üzerinden yayımlayabilirsiniz. ancak çok çok küçük bir kitleye hitap edebileceğinizi unutmayın.<br /><br />gelelim programımıza... öncelikle tasarladığım arayüzü göstereyim:<br /><a href="http://bp1.blogger.com/_LBrNwSktDyg/RvBy2RN27WI/AAAAAAAAAAs/98rnwedCO6o/s1600-h/mail.bmp"><img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_LBrNwSktDyg/RvBy2RN27WI/AAAAAAAAAAs/98rnwedCO6o/s320/mail.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5111711853725543778" /></a><br />büyük bir şey beklediyseniz, beklentilerinizi boşa çıkardığım için üzgünüm... arayüzü daha çok geliştirmek size kalmış. bu tasarım aşamasından sonra default.aspx.cs dosyasına kodlarımızı yazmaya başlayalım. programa eklemeniz gereken kütüphane System.Net.Mail; bütün işi bu kütüphane yapıyor zaten. postayı ekrandaki kime ve ileti alanlarını doldurarak oluşturduktan sonra tamam butonuna bastığımızda gerçekleşen olaylar şunlar: <br /><font color="red"> protected void Button1_Click(object sender, EventArgs e)<br /> {<br /> MailMessage posta = new MailMessage();<br /> posta.To.Add(TextBox1.Text);<br /> posta.From = new MailAddress("mail adresiniz", "herhangi bir isim", System.Text.Encoding.UTF8);<br /> posta.Body = TextBox2.Text;<br /> posta.BodyEncoding = System.Text.Encoding.UTF8;<br /> posta.Subject = "mail gönderme programı";<br /> posta.IsBodyHtml = false;<br /> posta.Priority = MailPriority.High;<br /> SmtpClient smtp = new SmtpClient();<br /> smtp.Credentials = new System.Net.NetworkCredential("kendi mail adresiniz", "şifreniz");<br /> smtp.Port = 587;<br /> smtp.EnableSsl = true;<br /> smtp.Send(posta);<br /> }<br /></font><br />system.net.mail kütüphanesindeki mailmessage sınıfından <font color="red">posta</font> isminde bir nesne türetiyoruz. öncelikle postayı kime göndereceğimizi belirtiyoruz. <font color="red">posta.to </font> özelliği bu işi yapmamızı sağlıyor. ben sadece tek bir kişiye gönderdiğim için direk textbox'ın içeriğini atadım. ancak textboxa adresleri virgülle ayırarak yazdıktan sonra, textbox içeriğini split fonksiyonuna tabi tutarsanız, her mail adresini <font color="red">posta.to.add(mail adresi)</font> metoduyla gönderilecekler listesine eklemeniz mümkün. sıra geldiği postanın kimden gittiğine. bu kişi siz oluyorsunuz. <font color="red"> posta.from </font> özelliğine mailaddress nesnesi atayarak bu sorunu da çözüyoruz. <font color="red">posta.body </font>özelliğine de iletimizi yazdığımız textbox'ın içeriğini atayarak, mailimizi hazırlamış bulunuyoruz. eğer yazdığımız ileti html dilinde yazıldıysa <font color="red">posta.isbodyhtml </font> özelliğini <font color="red">true </font> şeklinde değiştirmemiz gerekirdi. Son olarak mailimizin gönderme önceliğiliğini yüksek olarak ayarlıyoruz ve artık gmail'e bağlanmaya çalışıyoruz. bunun için smtpclient isimli sınıftan bir smtp protokolüne uygun istemci tanımlıyoruz ve istemci nesnemizin (<font color="red">smtp </font>nesnesi) gmaile güvenli olarak giriş yapabilmesi için kendi mail adresimizi ve şifremizi yazıyoruz.gmail mail göndermek için 587 nolu portu kullanır. port numaramızı da belirttikten sonra <font color="red">enableSsl</font> özelliğini <font color="red">true</font> olarak ayarlıyoruz. Ssl (secure sockets layer), soketlerin güvenli bir katman üzerinden çalışması için geliştirilmiştir. bu konunun dışında olduğu için minik bir açıklama yeterli olur diye düşünüyorum. son olarak <font color="red">smtp.send(posta)</font> şeklinde smtp istemcimizin send metoduna postamızı ekleyip maili gönderiyoruz. işte herşey bundan ibaret. yukarıda bahsettiğim gibi kendi smtp server'ınızı kullanmaya karar verirseniz gmaile bağlanmak yerine ilgili alanlara localhost yazmanız yeterli olacaktır. Umarım faydalı bir yazı olmuştur, iyi çalışmalar dilerim. Hoşçakalın...<br /></span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-18385713161674705682007-09-17T14:40:00.000-07:002007-09-19T05:25:25.149-07:00c# 2005 ile basit bir chat programımerhaba arkadaşlar. soket programlama konusuna giriş yapmak için bir mesajlaşma programı oldukça iyi bir fikir. Daha derin konulara temel olması açısından da doğru bir seçim olduğunu düşünüyorum. Soketlerle ilgili temel düzeyde bir program görmek için <a href="http://zburakguven.blogspot.com/2007/09/c-2005-ile-basit-bir-chat-program_17.html">tıklayın...</a><br /><span id="fullpost"> <br /> bu konu hakkında kendi yaptığım basit bir programı paylaşmak isterim. programı yazabilmek için önce biraz soket bilgimizin olması gerekiyor. kısaca soketleri anlatayım. <br /> soket kavramını aynı mahallede yaşayan komşuların evlerine benzetebiliriz. sakinlerden biri bir komşuya gittiğinde kapıyı çalar, kapı açıksa istediklerini alır ve gider. kapı da burada port kavramına tekabül etmektedir. soketler de aynı bilgisayar üzerinde iki programın ya da aynı ağ üzerinde 2 programın birbirleriyle iletişim kurmasını sağlayan yapılardır. komşular birbirleriyle aynı dili konuşmadıkları sürece anlaşmalarını bekleyemeyiz. bu durum soketler için de geçerlidir. veri alışverişi yapabilmek için çeşitli protokoller geliştirilmiştir. bunlardan biri ve en çok kullanılanı tcp protokolüdür. bir diğeri de udp'dir. bu ikisi arasındaki farka da kısaca değinmekte fayda var. tcp protokolünde bir bilgisayar veri gönderirken verinin ulaşıp ulaşmadığının da kontrolünü yapar ve sadece belirli bir adrese veriyi gönderir. udpde ise durum farklıdır. bilgisayar veriyi belirli portu kullanan her bilgisayara gönderir ve veriye ne olduğuyla ilgilenmez. udp'ye bir örnek verecek olursak; msnde konuşurken konferans yapmışsınızdır. bir pencereden yazdıklarınız konferansa dahil olan tüm kullanıcılara iletilir.Bu udp ile sağlanır. tcp ile ilgili örneği ise kod yazarak gösterelim. <br /> <br /> Herşeyden önce eklemeniz gereken kütüphaneler System.Net.Sockets, System.IO, System.Threading.programda bir sunucu bir de istemci olacak. ikisinin kodlarını anlaşılmasının kolaylığı açısından ayrı ayrı yazacağım. Kodlar birleştirilip, tek bir exe dosyası üzerinden sunucu ya da istemci olmaya karar verilebilir. sunucu formunu şu şekilde tasarladım: <br /><a href="http://bp0.blogger.com/_LBrNwSktDyg/Ru6ZgwkBu9I/AAAAAAAAAAc/DTJHaTAFGOg/s1600-h/serv.bmp"><img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_LBrNwSktDyg/Ru6ZgwkBu9I/AAAAAAAAAAc/DTJHaTAFGOg/s320/serv.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5111191415182965714" /></a> <br /> sunucu tarafında aşağıdaki bileşenlerden türettiğim bazı global değişkenler var: <br /> tcplistener: tcp'ye uygun bir port dinleme bileşenidir. <br /> networkstream: iki program arasında bağlantıyı kuran yapıdır. <br /> streamwriter: networkstream'e veri yazmak için kullandığımız bileşendir. <br /> streamreader: networkstream'den veri okumak için kullandığımız bileşendir. <br />çok geniş kapsamlı bir program yazmayacaksanız direk soket üzerinden okuma yazma yapabilirsiniz ancak ben kullanım kolaylığı ve programın genişletilebilir olması açısından (dosya göndermek gibi ek özellikler koyulabilir) networkstream bileşenini kullandım. <br /> soketlerin çalışma mantığı şu şekildedir: veriyi gönderirsiniz ve yeni veri gelene kadar hiç bir işlem yapamazsınız. bu da asenkron olarak mesajlaşmaya engel olur. bu sorunu aşmak için thread kullanmamız yeterli olacaktır. threadler bu konunun dışında olduğu için fazla açmayacağım. thread sayesinde bir taraftan mesaj yazıp gönderebilirken, diğer taraftan veri gelmesini bekleyebiliriz. tcplistener türünde değişkenimizi başlattıktan sonra okuma işini yapacak threadimizi de başlatıyoruz. <br /> <font color="red">Thread t;<br /> TcpListener dinle;<br /> private void button1_Click(object sender, EventArgs e)<br /> {<br /> dinle= new TcpListener(System.Net.IPAddress.Any,Convert.ToInt16(textBox1.Text));<br /> dinle.Start();<br /> t = new Thread(new ThreadStart(okumayabasla));<br /> t.Start();<br /> }</font><br /> bu aşamadan sonra okumak için kullandığım fonksiyonu göstereyim: <br /> <font color="red"><br /> Socket soket;<br /> NetworkStream ag;<br /> StreamReader oku;<br /> public void okumayabasla()<br /> {<br /> soket = dinle.AcceptSocket();<br /> ag = new NetworkStream(soket);<br /> oku = new StreamReader(ag);<br /> while (true)<br /> { try<br /> { string yazi= oku.ReadLine();<br /> ekranabas(yazi);<br /> }<br /> catch<br /> {return;}<br /> }}</font><br /> sanırım networkstream ile streamreader ikilisinin kullanımı anlaşılmıştır.<font color="red">acceptsocket</font> isimli metot,tcp bir ağda herhangi bir veri talebinin kabul edilmesi için kullanılır.<font color="red">ekranabas</font> fonksiyonu ise gelen yazıları ekranda göstermek için kullanılır. ancak bir thread içinden form bileşenlerine ulaşamadığımız için bir delege kullanmak zorundayız. delegeler de bu konunun dışında olduğu için bu konuya da değinmiyorum. sadece şunu söyleyebilirim, threadin içindeyken form bileşenleri uyuyormuş gibi algılanır ve bu uyku halini sonlandırmak için delege kullanılır. kullanımı da şu şekilde:<br /> <font color="red">public delegate void ricdegis(string text);<br />public void ekranabas(string s)<br /> {if (this.InvokeRequired)<br /> {ricdegis degis = new ricdegis(ekranabas);<br /> this.Invoke(degis, s);<br /> }<br /> else<br /> {s = "istemci: " + s;<br /> richTextBox1.AppendText(s+"\n");<br /> } }</font><br />gelen yazıları okumak bu kadar uzun sürüyor ancak yazmak o kadar da zor değil: <br /><font color ="red">StreamWriter yaz;<br /> private void button2_Click(object sender, EventArgs e)<br /> {yaz = new StreamWriter(ag);<br /> yaz.WriteLine(textBox2.Text);<br /> yaz.Flush();<br /> textBox2.Text = "";<br /> }</font><br /> evet programımızın <font color="red"> server kısmı</font> bu kadar. Aslında istem-ci tarafında yapacaklarımız da çok farklı şeyler değil. tek fark burada bir tcp din-leme değişkeni değil, tcp talep etme değişkeni tanımlayacağız. tabi bir istemci olduğumuz için, talepte bulunacağımız bir sunucu gerekir. bunun için forma sunucunun ip numarasını girebileceğimiz bir textbox ekledim: <br /><a href="http://bp1.blogger.com/_LBrNwSktDyg/Ru8VrwkBu-I/AAAAAAAAAAk/xqLOMyvZua0/s1600-h/iste.bmp"><img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_LBrNwSktDyg/Ru8VrwkBu-I/AAAAAAAAAAk/xqLOMyvZua0/s320/iste.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5111327943603370978" /></a><br /> yine aynı şekilde eklememiz gereken kütüphaneler System.Net.Sockets, System.IO, System.Threading. global değişkenlerimiz biri hariç yine aynı. tabi burda soket tanımlamamıza gerek yok. çünkü biz istemciyiz. var olan sokete bağlanıyoruz. şimdi kodları yazalım: <br /><font color ="red">TcpClient iste;<br />private void button1_Click(object sender, EventArgs e)<br /> { iste = new TcpClient(textBox1.Text, Convert.ToInt16(textBox2.Text));<br /> ag = iste.GetStream();<br /> yaz = new StreamWriter(ag);<br /> t = new Thread(new ThreadStart(okumayabasla));<br /> t.Start();<br /> }<br /> public void okumayabasla()<br /> { oku = new StreamReader(ag);<br /> while (true)<br /> { try<br /> { string yazi = oku.ReadLine();<br /> ekranabas(yazi);<br /> }<br /> catch{return;}<br /> }}</font><br />olayın farklılığını tekrar izah edelim: sunucumuzda bir soketimiz var ve sokette belirli bir portu açıyoruz. portu açtıktan sonra gelen verileri dinlemeye ve kabul etmeye başlıyoruz. istemcimizde ise soket tanımlamıyoruz çünkü soket zaten tanımlı. adından da anlaşılacağı üzere istemci talep eden durumunda olduğu için networkstream'i kontrol etmesi onun için yeterli oluyor. sunucu tarafında soketi çalıştırmamız da iletişimi sağlamak için yeterli oluyor. kalan istemci kodlarını yazmaya gerek görmüyorum, çünkü sunucu tarafındaki kodları kopyalayıp yapıştırmanız programın çalışması için kafidir. bu yaptığımız program aslında temel düzeyde bir telnet programı da sayılabilir. projenin aslını isteyen arkadaşlar, yorum kısmına mail adreslerini bırakırlarsa en kısa sürede gönderirim. hepinize iyi çalışmalar, hoşçakalın...<br /></span>z.burak güvenhttp://www.blogger.com/profile/05811760798267432461noreply@blogger.comtag:blogger.com,1999:blog-7768838126539432016.post-2820721810687606802007-09-17T12:53:00.001-07:002008-01-05T19:39:21.723-08:00bir taze hoşgeldiniz..<span style="color:#006600;"><strong>merhaba, pek yakında güncel konularla buradayım inşallah.. </strong></span><br /><strong style="color:#006600">daha yüksek performans göstericem söz veriyorum burak :) </strong>sevdalinkanoreply@blogger.com