<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-7768838126539432016</atom:id><lastBuildDate>Sun, 12 Feb 2012 13:33:32 +0000</lastBuildDate><category>windows</category><category>Kafamıza Göre</category><category>Programlama</category><title>--- SelamlaR ---</title><description /><link>http://zburakguven.blogspot.com/</link><managingEditor>noreply@blogger.com (z.burak güven)</managingEditor><generator>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/HerkeseMerhaba" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="herkesemerhaba" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">News &amp; Politics</media:category><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:subtitle></itunes:subtitle><itunes:category text="News &amp; Politics" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-7535739599890273512</guid><pubDate>Tue, 18 Jan 2011 09:02:00 +0000</pubDate><atom:updated>2011-01-18T01:08:34.085-08:00</atom:updated><title>Gel teskere :)</title><description>Arkadaşlar, öncelikle herkesin ilgisine ayrı ayrı teşekkür ederim. Kaynak kodlarımı bugüne kadar isteyen herkese gönderdim. Hatta o kadar ki bazılarıyla sonradan kodlar hakkında kritikler bile yaptık. &lt;br /&gt;&lt;br /&gt;Son bi kaç arkadaşa kaynak kodlarımı gönderemiyorum çünkü askerdeyim ve kaynak kodlarımın olduğu bilgisayarım kapalı. Burda öğrendiğim ve aslında hiç sevmediğim bir laf : " Askerlik bu, yapacak birşey yok !". Ama gerçekten durum bu. T%ekrar ilginize teşekkür ederim. Herkese iyi çalışmalar...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-7535739599890273512?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2011/01/gel-teskere.html</link><author>noreply@blogger.com (z.burak güven)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-864899847754536158</guid><pubDate>Mon, 01 Feb 2010 14:34:00 +0000</pubDate><atom:updated>2010-02-01T06:37:32.321-08:00</atom:updated><title>Biraz da şiir...</title><description>&lt;a href="http://zburakguven.blogspot.com/2010/02/omer-lutfi-meteden.html"&gt;Ömer Lütfi Mete'den ... &lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Uçurumun kenarındayım Hızır,&lt;br /&gt;Bir dilber kalesinin burcunda;&lt;br /&gt;Muhteşem belaya nazır,&lt;br /&gt;Topuklarım boşluğun avcunda...&lt;br /&gt;Derin yar adımı çağırır,&lt;br /&gt;Kaldım parmaklarımın ucunda...&lt;br /&gt;Uçurumun kenarındayım Hızır,&lt;br /&gt;Bir gamzelik rüzgar yetecek;&lt;br /&gt;Ha itti beni, ha itecek...&lt;br /&gt;Uçurumun kenarındayım Hızır,&lt;br /&gt;Civan hazır,&lt;br /&gt;Divan hazır,&lt;br /&gt;Ferman hazır,&lt;br /&gt;Kurban hazır...&lt;br /&gt;Güzelliğin zulme çaldığı sınır,&lt;br /&gt;Başım döner, aklım bulanır...&lt;br /&gt;El etmez...&lt;br /&gt;Gel etmez...&lt;br /&gt;Gözleri bir renk, bir davet,&lt;br /&gt;Gülce uzak uzak dolanır...&lt;br /&gt;Mecaz değil,maraz değil;&lt;br /&gt;Gülce semavî bir afet...&lt;br /&gt;Uçurumun kenarındayım Hızır,&lt;br /&gt;Gülce bir beyaz sihir,&lt;br /&gt;Canıma bedel bir haz,&lt;br /&gt;Nur, nar ve nurdan bir zehir,&lt;br /&gt;Gülce Araf’ta infaz...&lt;br /&gt;Bir tek bakışıyla suyum ısınır,&lt;br /&gt;Güzelliğin zulme çaldığı sınır...&lt;br /&gt;&lt;br /&gt;Uçurumun kenarındayım Hızır,&lt;br /&gt;Ben fakir, en hakir, bin taksir...&lt;br /&gt;Cahil cesaretimi alem tanır;&lt;br /&gt;Ateşten,&lt;br /&gt;Kalleşten, &lt;br /&gt;Mızrakla gürzden,&lt;br /&gt;Dabbat’ül Arzdan,&lt;br /&gt;Deccaldan, yedi düvelden&lt;br /&gt;Korku nedir bilmeyen ben;&lt;br /&gt;Tir tir titriyorum Gülce’den,&lt;br /&gt;Ödüm patlıyor Gülce’ye bakmaktan,&lt;br /&gt;Nutkum tutuluyor,ürperiyorum...&lt;br /&gt;Saniyeler gözlerimde birer can,&lt;br /&gt;Her saniyede bir can veriyorum...&lt;br /&gt;Uçurumun kenarındayım Hızır,&lt;br /&gt;Bir dilber kalesinin burcunda;&lt;br /&gt;Muhteşem belaya nazır,&lt;br /&gt;Topuklarım boşluğun avcunda...&lt;br /&gt;Derin yar adımı çağırır,&lt;br /&gt;Kaldım parmaklarımın ucunda...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-864899847754536158?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2010/02/omer-lutfi-meteden.html</link><author>noreply@blogger.com (z.burak güven)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-1690718271000972012</guid><pubDate>Thu, 10 Sep 2009 08:57:00 +0000</pubDate><atom:updated>2011-05-14T01:38:50.965-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>Visual Studio Setup Projesiyle Kurulum Dosyası Hazırlamak</title><description>Arkadaşlar merhaba, uzunca bir aradan sonra yeni bir paylaşımda bulunmak istedim. Bu seferki konumuz bir kurulum dosyası hazırlamak. Uzun uğraşlar sonucu, masaüstü uygulamanızı bitirdiniz ve artık teslim etmeniz gerekiyor. Kullanıcıya önce .Net framework indir, sonra sql server kur, sonra program dosyalarını kopyala, vs vs vs şeklinde cümleler kurarsanız, karşınızdaki vatandaş daha ilk dakikadan programdan soğur sanırım. Hele bilgisayar bilgisi fazla değilse tam bir facia. Bunu engellemek için bir kurulum dosyası hazırlarsınız ve kullanıcı sadece bir kaç kez 'ileri' düğmesini tıklayarak programı kurmuş olur. Gelin &lt;a href="http://zburakguven.blogspot.com/2009/09/visual-studio-setup-projesiyle-kurulum.html"&gt;buradan&lt;/a&gt; kurulum dosyası hazırlamaya başlayalım...&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Öncelikle kurulum yani setup projesi üzerine bir uzmanlığım olduğu söylenemez. Kendi yazdığım bir projenin kurulum dosyasını oluştururken bişeyler öğrendim ve bunları paylaşmak istedim. &lt;br /&gt;Öncelikle küçük bir demo proje hazırladım. Uygulama oldukça basit; form üzerinde 3 kolondan oluşan ve DevExpress'e ait bir Xtragrid ve grid altında da bir buton var. Butonu grid üzerinde &lt;br /&gt;yapılan değişikleri veritabanına aktarmak için kullandım. Proje basit ama mümkün olduğunca geniş tutmaya çalıştım; demo projesine bağlı bir de veritabanı oluşturdum. Herhangi bir kayıt &lt;br /&gt;defteri(regedit) etkiketi kullanmadım ama kurulum projesinde bu etiketleri de ekledim. Şimdi gelelim kurulum projemizin neler içerdiğine :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color = "Red"&gt;&lt;br /&gt;   * Demo projesinde Sql Express kullandığım için kurulum projesinde de sqlExpress kurma zorunluluğu doğdu. Bu arada ben kurulum projesinden Sql 2008 gibi büyük sürümleri kurmayı hiç denemedim.&lt;br /&gt;   Bu konuya ön şartlar kısmını anlatırken tekrar değinelim. &lt;br /&gt;   &lt;br/&gt;&lt;br /&gt;   * Projeyi .Net Framework 3.5 ile yazmıştım. Dolayısı ile kurulum projesinde de .Net FrameWork 3.5sp1 var.&lt;br /&gt;   &lt;br/&gt;&lt;br /&gt;   * Geniş projelerde kayıt defteri etiketleri kullanılabiliyor. Ben de örnek olması açısından projeye bir kaç etiket yerleştirdim.&lt;br /&gt;   &lt;br/&gt;&lt;br /&gt;   * Ben gerek veritabanı işlemlerini, gerek bileşen kütüphanelerini(dll dosyalarını) hep minik scriptlerle(bat dosyalarıyla) yaptım. Belki kolay yolu vardır ancak ben bulamadım. Daha doğrusu&lt;br /&gt;   aramadım. Çünkü bir hata olduğunda setup projesine müdahale edemiyorsunuz ama kendi scriptlerinizde arıza çıktığında hemen müdahale edebiliyorsunuz. &lt;br /&gt;   &lt;br/&gt;&lt;br /&gt;   * Son olarak da program dosyaları tabi ki. &lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;   Şimdi öncelikle benim proje hiyerarşime bir göz atalım : &lt;br /&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SqpYOsxnjtI/AAAAAAAAAFw/xFwGTHH2Wpo/s1600-h/prjList.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 284px; height: 187px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SqpYOsxnjtI/AAAAAAAAAFw/xFwGTHH2Wpo/s320/prjList.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5380209714408165074" /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;br /&gt;   Adım adım neler yaptığımızı görelim: Önce projeyi yazdık ve bitirdik. Sonra solution'a yeni bir proje ekledik. Eklediğimiz proje :   &lt;br /&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SqpYosc7joI/AAAAAAAAAF4/-URf9_h8lIY/s1600-h/addNew.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 318px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SqpYosc7joI/AAAAAAAAAF4/-URf9_h8lIY/s320/addNew.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5380210160997994114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;   &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/SqpZAqcY3-I/AAAAAAAAAGA/jxNqEJOxmZc/s1600-h/addSetup.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 209px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SqpZAqcY3-I/AAAAAAAAAGA/jxNqEJOxmZc/s320/addSetup.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5380210572775710690" /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;br /&gt;Görüldüğü üzere yeni bir kurulum projesi oluşturduk. Malum demo projemi .Net FrameWork 3.5 altında yazdığımı belirtmiştim. Bununla birlikte veritabanı da kullandığımı söyledim. Bu &lt;br /&gt;da demektir ki, hazırladığımız demo projenin kurulumu yapılmadan önce kesinlikle kurulum yapılacak bilgisayarda .Net FrameWork 3.5 ve SqlExpress olmalıdır. İşte bu durum önşart olarak,&lt;br /&gt;ingilizce terimiyle 'prerequisites', olarak geçmekte. Bu da bizim kurulum projemizin özellikler kısmından ayarlanabilir bir yapıdır. Kurulum projemize sağ tıklayıp özelliklerine girdikten &lt;br /&gt;sonra karşımıza gelen ekrandan üç farklı işlem gerçekleştirebiliriz : &lt;br /&gt;  &lt;br /&gt;    * "Configuration manager" düğmesine tıklayarak, projelerimizin build edilip edilmeyeceğine karar verebiliriz. Aynı zamanda release mod seçimi de yapabiliriz. Benim durumum şu: &lt;br /&gt;     &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LBrNwSktDyg/Sqpa2DUbKYI/AAAAAAAAAGI/GEZRoPBera8/s1600-h/configMng.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 297px; height: 320px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/Sqpa2DUbKYI/AAAAAAAAAGI/GEZRoPBera8/s320/configMng.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5380212589497887106" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;Dikkatinizi çekmek istediğim nokta şu, ben setup projesinden build sekmesindeki onay işaretini kaldırdım. Bunun sebebini çoğunuz biliyorsunuzdur zaten ama söylemekten zarar gelmez. &lt;br /&gt;Diyelim ki kurulum projesini, solution'a dahil ettik. Ancak sonradan asıl projede değişiklikler yapmamız gerekti. Bu bende çok sık oldu. Ordaki onay kutusunu boş bırakmazsanız setup &lt;br /&gt;projeniz de her seferinde tüm projeyle birlikte derlenir ki kurulum projesinin derlenmesi oldukça vakit alıyor. Build sekmesindeki onayı kaldırırsınız bu sorun çözülmüş oluyor.&lt;br /&gt; &lt;br /&gt;    * Özellikler penceresinden yapabileceğimiz bir diğer işlem projeden çıkacak dosyaya vereceğimiz isim, cab dosyası mı msi dosya mı karar vermek vs. &lt;br /&gt;&lt;br /&gt;    * Özellikler penceresinden asıl yapacağımız iş ise kurulum önşartları(prerequisites). Özellikler ekranından bu düğmeye tıkladığımıza karşımıza yeni bir pencere açılıyor. &lt;br /&gt; Bu pencereden de kullanıcının bilgisayarında kurulum başlamadan önce olması gerekenleri yani yukarda açıkladığım önşartları seçiyorsunuz. ben sql Express ve .Net framework 3.5 işaretledim: &lt;br /&gt;&lt;br /&gt;    &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SqjgPt65ZQI/AAAAAAAAAFQ/H5K3p8ETniw/s1600-h/prereq.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SqjgPt65ZQI/AAAAAAAAAFQ/H5K3p8ETniw/s320/prereq.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5379796315523343618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;     Burda dikkat edilmesi gereken nokta ön şartları seçtiğimiz listenin hemen altında, bu ön şartların nerden kurulacağını seçmemizi isteyen bir panel var. Ben bu panelden uygulamayla &lt;br /&gt;  aynı dizinden seçeneğini seçtim. Yukarda eklediğim resimde bunu görüyorsunuz zaten. Aynı dizini seçmek demek aslında önşartları, örneğin .Net frameWork'ünü, kurulum projesine gömmek &lt;br /&gt;  demek oluyor. Böylece kullanıcınızın internet bağlantısı yoksa bile gerekli kurulumları yapabiliyor. &lt;font color="red"&gt; burda bir noktaya dikkat çekmek istiyorum.&lt;/font&gt; &lt;br /&gt;  Nette yazanlara göre ön şart koşulundan .Net framework ve sqlExpress seçtikten sonra projenin klasörünün altına , bu bileşenlerin kurulum dosyalarını koyarsak işlerin yolunda gideceği &lt;br /&gt;  yazıyor ama ben bunu bi türlü başaramadım. Bi kişi kurulum dosyasının içine ön şart setuplarını gömmeyi becermiş ama proje kurulumu yaparken önşartlar hiç bi şekilde kontrol edilmemiş. &lt;br /&gt;  Bu sorunu benim nasıl çözdüğüme gelelim:&lt;br /&gt; &lt;br /&gt;     -&gt; Öncelikle .Net Framework offline setup'ı kendi bilgisayarınıza indirmelisiniz. &lt;a href="http://www.techdreams.org/microsoft/download-offline-installers-of-net-framework-35-35-sp1-30-20-from-microsoft-servers/1845-20090314"&gt;Buradan indirebilirsiniz.&lt;/a&gt; &lt;br /&gt;  Bu aşamada elinizde winrar olması gerekir. İndirdiğiniz setupa sağ tıklayarak dosyaları buraya çıkar demelisiniz:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/SqjkZs0I7pI/AAAAAAAAAFY/IOD2ORvJ69E/s1600-h/arc.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 243px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SqjkZs0I7pI/AAAAAAAAAFY/IOD2ORvJ69E/s320/arc.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5379800885071769234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Resimde diğer framework sürümleri de görünüyor, bizi ilgilendiren sadece 3.5 sürümü. Çıkan tüm dosyaları &lt;br /&gt;&lt;font color = "Red"&gt;C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\BootStrapper\Packages &lt;/font&gt; altına kopyalamalısınız. Bendeki görüntü şu şekilde: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/Sqjmo3bokQI/AAAAAAAAAFg/BG2TKQDoLuI/s1600-h/direct.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 119px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/Sqjmo3bokQI/AAAAAAAAAFg/BG2TKQDoLuI/s320/direct.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5379803344643068162" /&gt;&lt;/a&gt;&lt;br /&gt;     &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SqjmzF6PB4I/AAAAAAAAAFo/WaDc5USrHwI/s1600-h/direct1.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 102px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SqjmzF6PB4I/AAAAAAAAAFo/WaDc5USrHwI/s320/direct1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5379803520328206210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    SqlExpress setup'ını da &lt;font color = "Red"&gt;C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\BootStrapper\Packages &lt;/font&gt; altına kopyalamalısınız. Bu aşamadan sonra kurulum projenizi &lt;br /&gt;derlerseniz, derleme sonunda kurulum projesine ait debug klasörünün altında bir setup oluştuğunu ve setup'ın içinde frameWork ve sqlServer olduğunu görürsünüz: &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/Sq3yYQNs7zI/AAAAAAAAAGY/3DC_-1A6FMk/s1600-h/debug.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 53px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/Sq3yYQNs7zI/AAAAAAAAAGY/3DC_-1A6FMk/s320/debug.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381223628260831026" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;    Evet, ön şartlar için setupları da projeye gömmüş olduk. Sonraki adımımız hariçten kullandığımız bileşenlere ait kütüphaneleri (dll dosyalarını) setup projemize gömmek. Malumunuz dll &lt;br /&gt; dosyalarını projeyle aynı klasör altında tutmak ve Global Assembly Cache'ye atmak gibi iki farklı alternatifimiz var. Ben GAC'ye attım. Yalnız bu noktada bir sorun var. Visual Studio&lt;br /&gt; hariçten kullandığımız kütüphaneleri bağımlı dosyalar(dependencies) olarak algılıyor. Ancak bu kütüphaneleri kurulum sırasında kendiliğinden GAC'ye atıyor mu bilmiyorum. Bunu sağlayan bir &lt;br /&gt; sistem varsa onu da bilmiyorum. Ben daha önce hazırladığım script dosyama güvenmeyi tercih ettim. Script dosyasından bir kaç minik örnek vermekte fayda var sanırım : &lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LBrNwSktDyg/SqpiOsR9FcI/AAAAAAAAAGQ/dSnIZa7Ok7k/s1600-h/DevDll.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 173px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/SqpiOsR9FcI/AAAAAAAAAGQ/dSnIZa7Ok7k/s320/DevDll.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5380220709391635906" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;font color = "Red"&gt;&lt;br /&gt; &lt;br /&gt; * @Gacutil /i DevExpress.BonusSkins.v8.3.dll /silent&lt;br /&gt; * Gacutil /i DevExpress.Data.v8.3.Compact.dll /silent&lt;br /&gt; * @Gacutil /i DevExpress.Data.v8.3.dll /silent&lt;br /&gt; * @Gacutil /i DevExpress.OfficeSkins.v8.3.dll /silent&lt;br /&gt; * @Gacutil /i DevExpress.Tutorials.v8.3.dll /silent&lt;br /&gt; * @Gacutil /i DevExpress.Utils.v8.3.dll /silent&lt;br /&gt; &lt;br /&gt; &lt;/font&gt;&lt;br /&gt; &lt;br /&gt;   &lt;br /&gt;   Bu aşamada sanırım şimdiye kadar neler yaptığımızı bir toparlarsak fena olmaz : &lt;br /&gt;   &lt;br /&gt;   * Öncelikle tabi ki bir projemiz var.&lt;br /&gt;   * Projemizde duruma göre, haricen kullandığımız dll dosyaları, sqlExpress gibi bileşenler var. &lt;br /&gt;   * Bu bileşenlerden .Net Framework çevrimdışı kurulum paketini internetten indiriyoruz. İndirdiğimiz paketi, winrar gibi bir programla paketi &lt;br /&gt;   &lt;font color = "Red"&gt; C:\Program Files\Microsoft Visual Studio 9.0\SDK\v3.5\BootStrapper\Packages &lt;/font&gt; altına çıkartıyoruz.&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;    Buraya kadar herşey normal ama visual studio setup projesi scriptleri direk olarak çalıştırmıyordu. Ben de yazdığım scripti küçük bir exe'ye çevirdim. Bunu yapan çok ufak ve ücretsiz &lt;br /&gt; programlar mevcut. Benim kullandığım program &lt;a href="http://download.cnet.com/Bat-To-Exe-Converter/3000-2069_4-10555897.html"&gt;buradan &lt;/a&gt;indirilebilir. Bu minik program çalıştıracağınız &lt;br /&gt; script'in sessiz(silent) modda yani dos ekranını göstermeden çalışmasını da sağlıyor. küçük exemizi oluşturduktan sonra setup'a dahil etmemiz gerekiyor. Yavaş yavaş asıl kurulumu ifade &lt;br /&gt; eden şeyler oluşmaya başladı. Bu yüzden önce kurulum projesinin yapısını, daha sonra da neyi, nereye, nasıl ekleyeceğimizi anlatmak isterim: &lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/Sq4EnYcBlhI/AAAAAAAAAGo/9TSSpoa7Tuw/s1600-h/setupDir.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 295px; height: 320px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/Sq4EnYcBlhI/AAAAAAAAAGo/9TSSpoa7Tuw/s320/setupDir.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381243679375726098" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; * File System On Target Machine&lt;br /&gt;    &gt; Application Folder : Bu klasör bizim için çok önemli. Çünkü içine program dosyaları, iconlar, kısayollar, vs herşey buraya konuluyor. İlerde daha detaylı anlatacağım. &lt;br /&gt;    &gt; User's Dekstop : Adından da anlaşılacağı üzere hedef bilgisayarın masaüstüne bu klasörden ulaşabiliyoruz. &lt;br /&gt;    &gt; User's Programs Menu : Hedef bilgisayardaki "Başlat -&gt; Programlar" menüsüdür. Bildiğiniz üzere buraya da çeşitli kısayollar ekleniyor.&lt;br /&gt; * Solution Explorer penceresinde gördüğünüz, işaretlediğim noktalar ise şunlar:&lt;br /&gt;       &gt; File System Editor : File System On Target Machine dediğim kısım burası zaten.&lt;br /&gt;       &gt; Registry Editor : Hedef bilgisayardaki windows registry editörün bir simulasyonunu burda bulabilirsiniz. &lt;br /&gt;       &gt; File Types Editor : Açıkçası buna ihtiyacım hiç olmadığı için kullanma ve araştırma gereği de hissetmedim. Bu yüzden yanlış açıklama yapmak istemem.&lt;br /&gt;       &gt; User Interface Editor : Kullanıcıyı karşılayan, kurulumu yapacağı yeri vs seçmesine yardımcı olan karşılama ekranı.&lt;br /&gt;       &gt; Custom Actions Editor : Az önce hazırlamış olduğumuz küçük exeleri işte bu ekrandan çalıştıracağız. Birazdan daha detaylı anlatacağım.&lt;br /&gt;       &gt; Launch Conditions Editor : Ön şart diye bahsettiğimiz şeyleri burda da yapabilirsiniz. Sadece programların değil, programınızın çalışması için gerekli dosyaların olup olmadığını da  &lt;br /&gt;       buradan kontrol edebilirsiniz. Benim projemde böyle birşeye ihtiyaç yoktu, o yüzden ben burayı da es geçtim. &lt;br /&gt;    &lt;br /&gt;     Temel olarak kurulum yapısı bu şekilde. Artık kurulum dosyalarını projeye atmaya başlayabiliriz. Eklemek istediğimiz dosyaları, klasörleri sürükleyip; &lt;font color = "Red"&gt;Application &lt;br /&gt;  Folder&lt;/font&gt; klasörü altına bırakırsak başka bir işlem yapmamıza gerek kalmayacak. Öncelikle yukarda dll dosyaları için hazırladığımız minik exelerimizi kuruluma atalım. Benim exe &lt;br /&gt;  olarak hazırladığım program; DevExpress.Dll isimli klasördeki gac.bat isimli minik scripti çağırarak tüm dll dosyalarının GAC'ye atılmasını sağlıyor. Application folder içindeki görüntü &lt;br /&gt;  şekilde :&lt;br /&gt;  &lt;br /&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/Sq9Gxw6aS7I/AAAAAAAAAGw/WlJupMdKua0/s1600-h/dllFiles.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 280px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/Sq9Gxw6aS7I/AAAAAAAAAGw/WlJupMdKua0/s320/dllFiles.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381597900488461234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    RunGac.exe içinde minik bir script var. O script de DevExpress.DLL klasörü içindeki başka bir scripti çağırıyor. Asıl işi yapan zaten ikinci çağırdığım script. Her zaman olduğu gibi&lt;br /&gt; kodlarımı paylaşacağım için isteyen olursa ayrıntılı bilgiyle birlikte kodlarımı da gönderebilirim. &lt;font color = "Red"&gt; Burada&lt;/font&gt; asıl meselemiz RunGac.exe 'nin çalıştırılması. Az önce&lt;br /&gt; belirttim ama tekrar hatırlatmakta fayda var, bu exe kesinlikle öncelikle Application folder altına kopyalanmalıdır. Daha sonra yapacağımız işlem ise, Solution Explorer'dan Custom Actions &lt;br /&gt; Editor penceresini açmaktır. Aşağıdaki görüntü yaptıklarımı ziyadesiyle açıklar sanırım : &lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/Sq984emGiuI/AAAAAAAAAG4/WSdVKhsoCzA/s1600-h/CustomAction.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 313px; height: 320px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/Sq984emGiuI/AAAAAAAAAG4/WSdVKhsoCzA/s320/CustomAction.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381657389458426594" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/Sq9-t_bUYeI/AAAAAAAAAHA/T2Qn45-Hhd4/s1600-h/RunGAc.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 199px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/Sq9-t_bUYeI/AAAAAAAAAHA/T2Qn45-Hhd4/s320/RunGAc.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381659408316260834" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Dikkatinizi çektiyse custom actions editörümüz içinde install, commit, rollback ve uninstall gibi seçenekler mevcut. Gerçi ne işe yaradığını anlamışsınızdır ama ben söylemiş olayım: Yukarda &lt;br /&gt; hazırladığımız exe gibi kurulumun çalıştırmasını istediğini komutlar varsa, bu exeleri bu klasörlerden birinin altına koymalısınız. Yükleme esnasında işleminizin çalışmasını istiyorsanız &lt;br /&gt; install klasörünün altına, committen çok emin değilim(yani verdiğimiz komutların ne zaman çalıştırıldığından çok emin değilim), kurulum esnasında hata oluşması durumunda yaptığınız işlemleri&lt;br /&gt; geri almak isterseniz veyaz yaptığınız düzenlemelerin bi kısmını geri almak isterseniz rollback klasörü altına, programınız hedef bilgisayardan kaldırılırken bazı düzenlemeler yapmak ister-&lt;br /&gt; seniz de uninstall klasörünün altına gerekli exeleri koymalısınız.&lt;br /&gt; &lt;br /&gt; Buraya kadar bir sorunumuz yoktur umarım. Artık &lt;font color = "Red"&gt;Sql dosyalarımızı &lt;/font&gt; kurulum dosyası içine aktarmanın zamanı geldi. Bilgisayarınızda sadece SqlExpress olduğunu &lt;br /&gt; varsayarak anlatmaya başlayalım. &lt;font color = "Red"&gt;C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data&lt;/font&gt; klasörü altında SqlExpress 'te açtığımız veritabanı dosyalarını .mdf ve &lt;br /&gt; .ldf olarak görürüz. Ben şahsen bu dosyaları masaüstümde SQLDB diye farklı bir klasöre taşıdım. Çalıştıracağım scriptleri de bu klasöre koydum ve tabi ki bu scriptleri çalıştıracak bir de &lt;br /&gt; exe hazırladım. Şimdi exenin içeriğine bi bakalım : &lt;br /&gt;  &lt;br /&gt; &lt;br /&gt; &lt;font color = "RED"&gt;&lt;br /&gt; * @cls&lt;br /&gt; * @SET StartPath=%cd%&lt;br /&gt; * @XCOPY ".\SQLDB\*.*" "%ProgramFiles%\Microsoft SQL Server\MSSQL.1\MSSQL\Data" /y /Q&lt;br /&gt; * @cd %ProgramFiles%\Microsoft SQL Server\MSSQL.1\MSSQL\Data&lt;br /&gt; * @echo 1. sql script calistiriliyor.&lt;br /&gt; * @sqlcmd -E -S .\SQLExpress -i DropBlogSetup.sql&lt;br /&gt; * @echo 2. sql script calistiriliyor.&lt;br /&gt; * @sqlcmd -E -S .\SQLExpress -i AttachBlogSetup.sql&lt;br /&gt; * @echo Veritabani attach ediliyor.&lt;br /&gt; * @SSEUtil -m -a BlogSetup.mdf BlogSetup &lt;br /&gt; &lt;/font&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Gördüğünüz üzere SqlDb içindeki scriptlerin çağrılmasından başka bir şey yapmıyor bu exe. Şimdi bunu da götürüp Custom Actions Editörümüze ekleyelim. Ancak önce tabi ki Application Folder &lt;br /&gt; klasörüne ekliyoruz. Bendeki son durum şu şekilde:&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/Sq-Uu1Cx87I/AAAAAAAAAHI/ZTR-12itfAg/s1600-h/CustomAc2.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 100px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/Sq-Uu1Cx87I/AAAAAAAAAHI/ZTR-12itfAg/s320/CustomAc2.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381683611964666802" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Evet kurulum dosyamızda dll dosyalarımız ve Sql dosyalarımız gömülü durumda. Sırada program dosyalarını eklemek var. Bunun en basit yolu bence yazdığınız projenin debug klasörünü komple &lt;br /&gt; Application Folder klasörüne sürükleyip bırakmanız. Ancak şu şekilde de yapabilirsiniz :&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/SrCdt98FbHI/AAAAAAAAAHQ/2ep1_BVYtGk/s1600-h/addPrjOut.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 108px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SrCdt98FbHI/AAAAAAAAAHQ/2ep1_BVYtGk/s320/addPrjOut.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381974967753993330" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LBrNwSktDyg/SrCekIYR-hI/AAAAAAAAAHY/8uiCtJEmCa0/s1600-h/addPrjOut1.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 272px; height: 320px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/SrCekIYR-hI/AAAAAAAAAHY/8uiCtJEmCa0/s320/addPrjOut1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381975898269547026" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Resimlerden de gördüğünüz üzere, Solution içinde bulunan herhangi bir projenin oluşturduğu exe ve dll dosylarını Primary Output olarak kurulum projesine dahil edebiliyorsunuz. Bu da ikinci &lt;br /&gt; yöntemdi. Ben sürükleyip bırakmayı tercih ediyorum :)&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/SrCfdlAYyVI/AAAAAAAAAHg/q9DqIBAAabU/s1600-h/addPrgFiles.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 127px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SrCfdlAYyVI/AAAAAAAAAHg/q9DqIBAAabU/s320/addPrgFiles.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381976885206501714" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Projemizin son hali bu oldu. Dilerseniz neler yaptığımızı tekrar sıralayalım :&lt;br /&gt; &lt;br /&gt; &lt;font color = "Red"&gt;&lt;br /&gt; * .Net Framework'ün hedef bilgisayarda olma koşulu&lt;br /&gt; * .Net Framework 'ün ve internetin olmaması ihtimaline karşı, kurulum projesi içine setup gömmek&lt;br /&gt; * SqlExpress'in hedef bilgisayarda olma koşulu&lt;br /&gt; * SqlExpress'in hedef bilgisayarda olmaması ihtimaline karşı, kurulum projesi içine setup gömmek&lt;br /&gt; * Haricen kullandığımız dll dosyalarının proje içine eklenmesi&lt;br /&gt; * Eklediğimiz dll dosyalarını hedef bilgisayara aktaracak Custom Action işleminin yapılması&lt;br /&gt; * Kullandığımız veritabanının proje içine dahil edilmesi&lt;br /&gt; * Eklediğimiz dll dosyalarını hedef bilgisayara aktaracak Custom Action işleminin yapılması&lt;br /&gt; * Program dosyalarımızın projeye dahil edilmesi&lt;br /&gt; &lt;/font&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; Bu aşamadan sonra bir ihtimal olarak kullanmış olabileceğimiz kayıt defteri etiketlerini hedef bilgisayara işleme durumu var. Aslında bunu da scriptlerle yapabiliriz. Ama visual Studio ol-&lt;br /&gt; dukça kullanışlı bir arayüz koymuş. Dilerseniz kısa da olsa onu anlatayım :&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/SrClh8gN2GI/AAAAAAAAAHo/OmYqC1F8dNM/s1600-h/regedit.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SrClh8gN2GI/AAAAAAAAAHo/OmYqC1F8dNM/s320/regedit.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5381983557303261282" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Gördüğünüz üzere hedef bilgisayardaki kayıt defterinin simülatörü diyebileceğimiz bir ekranımız var. İstediğimiz kayıt defteri etiketini burada oluşturabiliriz. Kurulum paketi bizim için &lt;br /&gt; hedef bilgisayarda gerekli yerlerde gerekli kayıtları açacaktır. Yapacağımız şey çok basit; normalde kendi kayıt defterimizde nasıl kayıt açıyorsak, bu ekranda da aynı şekilde kayıt açmak :&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SrC38jn1kjI/AAAAAAAAAHw/Iw1CZrr1eWk/s1600-h/regedit1.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SrC38jn1kjI/AAAAAAAAAHw/Iw1CZrr1eWk/s320/regedit1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382003805690106418" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Arkadaşlar gördüğünüz üzere kayıt defterimize de gerekli eklemeleri yaptık. Bundan sonra yapacağımız işlem kullanıcı arayüzünü geliştirmek ki orası da artık tamamen size kalmış.&lt;br /&gt;    Visual studio değişiklik yapabileceğiniz alanları oldukça kısıtlı tutmuş. Sadece ekrandaki yazıları değiştirebiliyorsunuz. Onların da bir kaç tanesini ancak. Bu kısıtlamadan dolayı &lt;br /&gt; bu kısmı pas geçiyorum çünkü yapılabilecek gerçekten fazla bişey yok ya da varsa da ben bulamadım :)&lt;br /&gt; &lt;br /&gt; Son olarak belirtmek istediğim bir kaç özellik var. Programınıza başlık vs atayabileceğiniz bir özellik penceresi var. Burda da ufak tefek değişiklikler yapabilirsiniz : &lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/SrDJgLhsI9I/AAAAAAAAAH4/nbTXULxLiDw/s1600-h/prop.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 213px; height: 320px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SrDJgLhsI9I/AAAAAAAAAH4/nbTXULxLiDw/s320/prop.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382023109394834386" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Bir diğer minik özellik, kısayol eklemek : &lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SrDbix1I7nI/AAAAAAAAAIA/Rzd24SgT6D4/s1600-h/scut.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 166px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SrDbix1I7nI/AAAAAAAAAIA/Rzd24SgT6D4/s320/scut.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382042945245998706" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDclujQzTI/AAAAAAAAAII/gHZt8pTeMiU/s1600-h/scut1.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 146px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDclujQzTI/AAAAAAAAAII/gHZt8pTeMiU/s320/scut1.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382044095416945970" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Hazırladığınız programın çalışması için masaüstüne, başlat-&gt; programlar klasörüne kısayolları eklemek isterseniz bu yöntemle kolayca yapabilirsiniz. Üst resimde gördüğünüz kısayolu kesip, &lt;br /&gt; User's dekstop klasörüne yapıştırırsanız, kısayolunuz bi anda hazır olur :) Hatta isterseniz bu kısayollara icon da koyabilirsiniz şöyle ki : &lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDh_bMVL1I/AAAAAAAAAIQ/Yo_SxQ5VN3o/s1600-h/AddIcon.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 148px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDh_bMVL1I/AAAAAAAAAIQ/Yo_SxQ5VN3o/s320/AddIcon.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382050034455228242" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_LBrNwSktDyg/SrDmNkIVlMI/AAAAAAAAAIY/NmAwBGbW2o8/s1600-h/BrowseIcon.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SrDmNkIVlMI/AAAAAAAAAIY/NmAwBGbW2o8/s320/BrowseIcon.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382054675419075778" /&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDmN38nCoI/AAAAAAAAAIg/Zt3U3hh7IIA/s1600-h/FoundIcon.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 208px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDmN38nCoI/AAAAAAAAAIg/Zt3U3hh7IIA/s320/FoundIcon.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382054680738597506" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; Evet sanırım ikonlarımızı da ekleyince programımız hazır duruma geldi. Derleyip bir depolama aracına attığımız zaten setup.exe'yi çalıştırmak bizim için yeterli olacaktır :&lt;br /&gt;  &lt;br /&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_LBrNwSktDyg/SrDwtnmbkEI/AAAAAAAAAIo/J0prZMJysp0/s1600-h/kayit.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 245px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/SrDwtnmbkEI/AAAAAAAAAIo/J0prZMJysp0/s320/kayit.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382066221222694978" /&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_LBrNwSktDyg/SrDx63C1CmI/AAAAAAAAAIw/AYi1CsEALHs/s1600-h/sqlBl.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 112px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SrDx63C1CmI/AAAAAAAAAIw/AYi1CsEALHs/s320/sqlBl.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382067548218264162" /&gt;&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDy4BHSYoI/AAAAAAAAAI4/EdIsBfyi37U/s1600-h/dekstop.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 199px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SrDy4BHSYoI/AAAAAAAAAI4/EdIsBfyi37U/s320/dekstop.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5382068598893339266" /&gt;&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt; &lt;br /&gt; Burda maalesef kaynak kod yok ama yine de aklınıza takılan bişey olursa elimden geleni yapmaya çalışırım. İsteyen olursa hazırladığım scriptleri gönderirim. Şimdilik bu kadar. Bi sonraki&lt;br /&gt; yazıda görüşmek üzere, herkese iyi çalışmalar dilerim...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-1690718271000972012?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2009/09/visual-studio-setup-projesiyle-kurulum.html</link><author>noreply@blogger.com (z.burak güven)</author><media:thumbnail url="http://2.bp.blogspot.com/_LBrNwSktDyg/SqpYOsxnjtI/AAAAAAAAAFw/xFwGTHH2Wpo/s72-c/prjList.bmp" height="72" width="72" /><thr:total>11</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-8107793597032965959</guid><pubDate>Mon, 15 Jun 2009 19:09:00 +0000</pubDate><atom:updated>2009-06-15T13:20:54.189-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>C# ile Spider (Crawler - Web Örümcek) Örneği Bölüm 3: C# İle Çoklu Thread Uygulaması</title><description>Oldukça uzun bir aradan sonra tekrar merhaba. Daha önceki paylaşımlarıma binaen kaynak kodları isteyen arkadaşlara, elimden gelen &lt;br /&gt;yardımı yapmaya çalıştım. Son olarak C# ile çoklu thread uygulaması gerçekleştirip bu paylaşıma bir nokta koymak niyetindeyim. &lt;br /&gt;C# ile çoklu thread uygulaması ilginizi çekiyorsa buyrun &lt;br /&gt;&lt;a href="http://zburakguven.blogspot.com/2009/06/c-ile-spider-crawler-web-orumcek-ornegi.html"&gt;burdan &lt;/a&gt;devam edelim.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Öncelikle thread ya da Türkçe ifadesiyle kanal nedir biraz bunu anlatmaya çalışayım. &lt;br /&gt;Malumunuz işlemci dediğimiz donanım, bilgisayarımızın en hızlı parçası. &lt;br /&gt;Sabit disk ya da diğer donanımlar şöyle dursun, ram'in bile bu hıza ayak uydurması pek kolay değil. &lt;br /&gt;Bu bilgisayarın doğal sonucudur. Çünkü bilgisayarın bizim yaptığı şey 1 ve &lt;br /&gt;0ları olabildiğince çabuk işlemektir ve bu işlemeyi işlemci, bellek yardımıyla yapmak zorundadır. &lt;br /&gt;Elektrik akımını da biz gözle seçemeyeceğimiz için, bilgisayarımız sanki aynı anda birden fazla iş &lt;br /&gt;yapıyormuş gibi görürüz. Ancak durum gerçekte pek de öyle değil. Daha doğrusu yakın zamana kadar pek öyle değildi. &lt;br /&gt;Son bir kaç yıldır, 2 hatta 4 çekirdekli işlemciler piyasanın tamamına hakim olduğu için bilgisayarlarımız &lt;br /&gt;hakikaten aynı anda bir kaç iş yapmaktadır. Aynı anda bir kaç iş yapsa bile, aynı anda tüm işleri yapması mümkün değildir. &lt;br /&gt;Bir düşünün; msn'de bir arkadaşınızla sohbet ediyorsunuz. Msn ayrı kaynak tüketiyor, klavyede yazı yazmanız lazım, &lt;br /&gt;o ayrı kaynak tüketiyor. Ekran kartının görüntü üretmesi lazım, onlar ayrı kaynak tüketiyor (Gerçi ekran kartlarının &lt;br /&gt;da artık kendi grafik işlemcileri var). Herşey işlemcinin kapısında beklemek zorunda. 4 çekirdeğimiz bile olsa, aynı &lt;br /&gt;anda tüm işlerin en fazla 4 tanesine cevap verebiliriz. İşte işlemci bu işlemlerin hepsini bir sıraya koyar bizim yerimize. &lt;br /&gt;Ancak bazı durumlarda bizim araya bişeyler sıkıştırmamız gerekebilir. İşte tam bu noktada imdadımıza thread yani kanal &lt;br /&gt;yetişmektedir. Bence kanal yerine kaynakçı deselermiş daha güzel olurmuş :). Çünkü yaptığı şey neredeyse tamamen araya kaynak yapmak. &lt;br /&gt;İşlemcide kuyrukta bekleyen işlemler üzerine yapışıp, arada kendi işlerini de yaptırmak. Kaynakçılık gerçek hayatta ne kadar kötü birşey olsa&lt;br /&gt;da, bilgisayar üzerinde bizim için çok iyi bişey. Şöyle ki, programı kanallara böldüğünüz zaman, aynı dosyaları, aynı ağı, aynı kaynakları &lt;br /&gt;asenkron olarak kullanmamıza olanak sağlar. Bu da çok kısa zamanda, çok fazla iş yapmamıza olanak sağlar. Böylece uzun sürecek işlemlerimiz için&lt;br /&gt;beklemeden kısa yoldan işlemlerimizi gerçekleştirebiliriz. Eminim ki birçok kişi ie7+, mozilla 2.0+, chrome gibi masaüstü uygulamalarında &lt;br /&gt;çoklu sekme özelliğini oldukça hoş karşılamıştır. Her tarayıcı için ayrı bir pencere açmaktansa, sekme açmayı yeğlerim şahsen. Bir düşünün bir &lt;br /&gt;sekmenin işini bitirmeden, öteki sekmenin bekleyip durduğunu. Sekme olmasının bi anlamı kalmazdı... &lt;br /&gt;&lt;br /&gt;İşin gevezeliğini bir yana bırakıp, koda geçtiğimizde demek istediğimi daha iyi anlayacaksınız. C#, daha doğrusu .Net çatısı bize &lt;br /&gt;çoklu kanal uygulamaları geliştirebilmemiz için iki farklı yöntem sağlamıştır. Birincisi, manuel olarak kanalları kendimiz başlatır,&lt;br /&gt;kendimiz yönetiriz. İkincisi Asenkron sınıfı kullanarak C#'ın bize yardım etmesini sağlarız. Asenkron kullanım biraz daha karmaşık &lt;br /&gt;olduğu için zamanında uygulamayı elle çalıştırdığım kanallar ile gerçekleştirmiştim. Şimdi biraz kod yazmaya başlayalım. &lt;br /&gt; &lt;br /&gt;Bu paylaşımın daha önceki iki bölümünde oluşturmaya çalıştığım programı anlatmıştım. Kaldığım yerden devam ederek , hem programı hem de &lt;br /&gt;kanal yapısını anlatmayı düşünüyorum. Programda kullandığım tablolardan, gezinmek üzere kaydettiğim sitelerin listesini çekip, threadleri birer &lt;br /&gt;birer çalıştırmaya başladım: &lt;br /&gt;&lt;br /&gt;int i = 0;&lt;br /&gt;string[] tablolar = { "tablo1", "tablo2", "tablo3", "tablo4", "tablo5" };&lt;br /&gt;&lt;br /&gt;OleDbCommand komut = new OleDbCommand();&lt;br /&gt;komut.Connection = bag;&lt;br /&gt;OleDbDataReader siteal;&lt;br /&gt;komut.CommandText = "select anasayfa,urunara from siteler where tara=0";&lt;br /&gt;siteal = komut.ExecuteReader();&lt;br /&gt;if (siteal.HasRows == false) return false;&lt;br /&gt;&lt;br /&gt;while (siteal.Read())&lt;br /&gt;{                &lt;br /&gt;asil = siteal[0].ToString();&lt;br /&gt;&lt;br /&gt;OleDbCommand anasayfa = new OleDbCommand();&lt;br /&gt;anasayfa.CommandText = "insert into gelen values ('" + asil + "')";&lt;br /&gt;anasayfa.Connection = bag;&lt;br /&gt;anasayfa.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;Thread[] kanal = new Thread[4];&lt;br /&gt;for (int t = 0; t &lt; 4; t++)&lt;br /&gt;{&lt;br /&gt; kanal[t] = new Thread(new ThreadStart(basla));&lt;br /&gt; kanal[t].Name = t.ToString();&lt;br /&gt; kanal[t].Start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;while (true)&lt;br /&gt;{&lt;br /&gt; int j = 0;&lt;br /&gt; for (int k = 0; k &lt; 4; k++)&lt;br /&gt; {&lt;br /&gt;  if (!kanal[k].IsAlive)&lt;br /&gt;   j++;&lt;br /&gt; }&lt;br /&gt; if (j == 4) { break; }&lt;br /&gt; Thread.Sleep(2500);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string kom = siteal[1].ToString();&lt;br /&gt;OleDbDataAdapter adaptor = new OleDbDataAdapter();&lt;br /&gt;adaptor.SelectCommand = new OleDbCommand(kom, bag);&lt;br /&gt;adaptor.Fill(veritb, tablolar[i]);&lt;br /&gt;i++;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Kodun anlamsız olmasına bakmayın, bizi ilgilendiren minik bir parçası :&lt;br /&gt;&lt;span style="color:Red"&gt;&lt;br /&gt;Thread[] kanal = new Thread[4];&lt;br /&gt;for (int t = 0; t &lt; 4; t++)&lt;br /&gt;{&lt;br /&gt; kanal[t] = new Thread(new ThreadStart(basla));&lt;br /&gt; kanal[t].Name = t.ToString();&lt;br /&gt; kanal[t].Start();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;while (true)&lt;br /&gt;{&lt;br /&gt; int j = 0;&lt;br /&gt; for (int k = 0; k &lt; 4; k++)&lt;br /&gt; {&lt;br /&gt;  if (!kanal[k].IsAlive)&lt;br /&gt;   j++;&lt;br /&gt; }&lt;br /&gt; if (j == 4) { break; }&lt;br /&gt; Thread.Sleep(2500);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yapmaya çalıştığımız şey; 4 adet kanal oluşturmak. Sonra da tüm kanallarımızın işinin bitip bitmediğini kontrol etmek. &lt;br /&gt;Bunu da .IsAlive fonksiyonuyla yapmak. Eğer 4 kanalımız da işini bitirdiyse, uygulamamızı çalıştıran ana kanala dönüp,&lt;br /&gt;programın kaldığı yerden devam etmesini sağlamalıyız. Bitirmediyse, ana kanalı 2,5 saniye bekletip tekrar oluşturduğumuz&lt;br /&gt;4 kanalın çalışıp çalışmadığını kontrol ettirmeliyiz. &lt;br /&gt;&lt;br /&gt;Burda asıl önemli nokta &lt;span style="color:Red"&gt;new Thread(new ThreadStart(basla))&lt;/span&gt; ifadesinin ne işe yaradığıdır. Gerçi ne&lt;br /&gt;anlama geldiği ortada ancak biz yine de bahsetmiş olalım: oluşturduğumuz yeni kanalın nereden başlayacağını işaret etmek için &lt;br /&gt;new ThreadStart()  ifadesini kullanmamız yeterli oluyor. Asıl işi yaptığımız yeri açıklayalım biraz da: &lt;br /&gt;&lt;br /&gt;Arada yazdığım kodların tamamını buraya aktarmayı düşünmüyorum. Zaten ilgilenenlere kaynak kodun tamamını yolluyorum. Anlatmak &lt;br /&gt;istediğim bir kaç önemli nokta var. Birincisi yukarda bahsettiğimiz aynı anda, aynı dosya, aynı ağ, aynı kaynak kullanımını nasıl&lt;br /&gt;sağlayacağımız. Sonuçta aynı dosyaya aynı anda sadece bir tek kanal erişebilir. Bu durumu şöyle aşıyoruz: &lt;br /&gt;&lt;br /&gt;Kullanacağımız kaynak bir veritabanıysa Transaction başlatabiliriz. Ancak ben sadece veritabanı kullanılmayacağını hesaba katarak&lt;br /&gt;&lt;span style="color:Red"&gt;Monitor &lt;/span&gt; nesnesini kullandım. Bunun yerine 'lock' da kullanılabilirdi. Ancak Monitor daha kullanışlı. Şöyle&lt;br /&gt;ki:&lt;br /&gt;&lt;br /&gt;Monitor.Enter(object) fonksiyonuyla birlikte, o an için kilitlemek istediğimzi nesneyi çağırıyoruz. Bu nesne bizim veritabanı bağlantımız&lt;br /&gt;olunca bir nevi transaction gerçekleştirmiş oluyoruz. Yani böylece kaynağı, o anki kanaldan başka kimse kullanamaz demiş oluyoruz.&lt;br /&gt;Monitor.Exit() fonksiyonunu kullandığımızda ise, kilidi kaldırıp kaynağı serbest bırakmış oluyoruz. Bundan başka Monitor.PulseAll() &lt;br /&gt;fonksiyonu da çok kullanışlı bir fonksiyon. Sonuçta bizim tek bir veritabanımız ve 4 ayrı kanalımız var. Veritabanı üzerinde bir kanal &lt;br /&gt;işlem yaparken, diğer kanallar kuyrukta bekleyecektir. PulseAll() dediğimiz zaman, kaynağın artık serbest kaldığını diğer kanallara iletmiş&lt;br /&gt;oluyoruz. İşlemcimiz de ilk sıradaki kanalı işlemeye başlıyor böylece.&lt;br /&gt;&lt;br /&gt;Evet, olayımız bu kadar diyebilirim. Bu 4 kanala, tüm linkleri gezdirdikten sonra, bir de linkleri ayrıştırma işini verirsek, programımız &lt;br /&gt;gayet güzel bir şekilde çalışmış olacak. Sonuç olarak temel anlamda çoklu kanal uygulaması geliştirmiş olduk. Daha önceki yazılarımda&lt;br /&gt;belirttiğim gibi, isteyen arkadaşlara kaynak kodları gönderebilirim. Tekrar görüşünceye dek, hoşçakalın...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-8107793597032965959?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2009/06/c-ile-spider-crawler-web-orumcek-ornegi.html</link><author>noreply@blogger.com (z.burak güven)</author><thr:total>10</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-1801281089528344657</guid><pubDate>Sun, 23 Nov 2008 22:20:00 +0000</pubDate><atom:updated>2009-06-15T13:20:54.189-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>C# ile Spider (Crawler - Web Örümcek) Örneği Bölüm 2: C# İle Access komutları</title><description>Tekrar merhaba. İşten güçten fırsat bulup da oturup iki satır yazı yazamaz oldum. Sitede gezip de umduğunu bulamayanlardan şimdiden özür dilerim. Lafı fazla uzatmadan &lt;br /&gt;konumuza giriş yapalım: Maksadımız C# dili ile Access komutlarını kullanmak. Öncelikle şunu belirteyim. Baştan programı yazarken çok büyük çaplı bişey tasarlamadığım için access veritabanını kullandım. Dolayısıyla performans kaybı kaçınılmaz oldu. Ancak access yerine SQL ya da daha güçlü bir veritabanı kullanırsanız çok daha performanslı bir sistem kurmuş olursunuz. C# ile daha önce Access bağlantısı kurmadıysanız buyrun &lt;a href="http://zburakguven.blogspot.com/2008/11/c-ile-spider-crawler-web-rmcek-rnei-blm.html"&gt;burdan &lt;/a&gt; devam edelim. &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Öncelikle bir veritabanı dosyası tasarlamalıyız. Benim basit olarak tasarladığım dosya şu şekilde: &lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LBrNwSktDyg/SSnZ_C0PuxI/AAAAAAAAADY/aLsopzIOXyc/s1600-h/blog1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 226px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SSnZ_C0PuxI/AAAAAAAAADY/aLsopzIOXyc/s320/blog1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271984515924867858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Gördüğünüz gibi 4 tane temel tablomuz var. Tabloların ne anlama geldiklerinden kısaca bahsedelim: Gelen tablomuz, birinci bölümde bahsettiğimiz düzenli ifadelerin, html sayfasına uygulanması sonucunda sayfadan elde ettiğimiz linklerin listesini tutar. Yani bir anlamda, programımızın GEZECEĞİ linkleri tutan tablodur. Giden tablosu da sitemizin GEZDİĞİ linkleri tutan tablodur. Siteler tablomuz ise, programımızın içinde veri arayacağı siteleri tutar. Ürünler tablomuz ise, sitelerin gezilmesi sonucu bulunan ürünleri tutan tablomuzdur.&lt;br /&gt;&lt;br /&gt;Dilerseniz, tabloların içeriklerini de gösterelim: &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LBrNwSktDyg/SSnbwCStjoI/AAAAAAAAADg/amoCQtrZgX0/s1600-h/blog2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 183px; height: 320px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SSnbwCStjoI/AAAAAAAAADg/amoCQtrZgX0/s320/blog2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271986457109433986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Alanların anlamlarını program içinde zaten anlayacağımız için, alanların açıklamasına şu anda girme gereği görmüyorum. Şimdi işin programcı tarafını ilgilendiren tarafına giriş yapalım. Bu veri tabanı dosyasını sistemimize entegre etmekle işe başlayalım isterseniz. Yapacağımız işlemler aslında çok basit. Visual Studio aslında işin çoğunu bizim yerimize yapar. Yine de adım adım göstermekte fayda var diye düşünüyorum: &lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LBrNwSktDyg/SSncpmVgjYI/AAAAAAAAADo/tV2pqGsCE6w/s1600-h/blog3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 56px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SSncpmVgjYI/AAAAAAAAADo/tV2pqGsCE6w/s320/blog3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271987446037384578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LBrNwSktDyg/SSne2C9UCzI/AAAAAAAAADw/sDAEPkNu5b8/s1600-h/blog4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/SSne2C9UCzI/AAAAAAAAADw/sDAEPkNu5b8/s320/blog4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271989858902215474" /&gt;&lt;/a&gt;&lt;br /&gt;Bu aşamada Next ya da ileri diyerek devam ediyoruz. Bir sonraki sayfadan da &lt;font color="RED"&gt;NEW CONNECTION&lt;/font&gt; düğmesini tıklayarak ilerliyoruz. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LBrNwSktDyg/SSne828TbiI/AAAAAAAAAD4/GvFcqsb55XY/s1600-h/blog5.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SSne828TbiI/AAAAAAAAAD4/GvFcqsb55XY/s320/blog5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271989975935839778" /&gt;&lt;/a&gt;&lt;br /&gt;Access veri tabanı kullanacağımız için Microsoft Access DataBase File seçerek Continue ya da Devam diyoruz.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LBrNwSktDyg/SSnfEls674I/AAAAAAAAAEA/fufsnDh-nQ4/s1600-h/blog6.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 243px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/SSnfEls674I/AAAAAAAAAEA/fufsnDh-nQ4/s320/blog6.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271990108746870658" /&gt;&lt;/a&gt;&lt;br /&gt;Hazırladığımız access dosyasını Browse ya da Gözat düğmesi ile buluyoruz. Test Connection diyerek bağlantımızı da test ettikten sonra tamam diyoruz.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_LBrNwSktDyg/SSnfI5ahrGI/AAAAAAAAAEI/60o86oAG_Wc/s1600-h/blog7.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 246px;" src="http://4.bp.blogspot.com/_LBrNwSktDyg/SSnfI5ahrGI/AAAAAAAAAEI/60o86oAG_Wc/s320/blog7.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271990182757903458" /&gt;&lt;/a&gt;&lt;br /&gt;Son olarak da kullanmak istediğimiz view ve tabloları seçerek yolumuza devam ediyoruz. &lt;br /&gt;&lt;br /&gt;Proje klasörümüzde app.config dosyamıza baktığımızda, visual studio'nun bizim için bir bağlantı metni oluşturduğunu da görebiliriz. &lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_LBrNwSktDyg/SSniH9vCVUI/AAAAAAAAAEQ/LB1GK8pVBA8/s1600-h/blog1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 105px;" src="http://1.bp.blogspot.com/_LBrNwSktDyg/SSniH9vCVUI/AAAAAAAAAEQ/LB1GK8pVBA8/s320/blog1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271993465272685890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Evet, artık bir veritabanımız da hazır olduğuna göre, artık sorgulama, veri girme vs. veritabanı komutlarına gelebiliriz. &lt;br /&gt;&lt;br /&gt;Öncelikle C# 'ın veritabanı erişimi için kullandığı mimariden biraz bahsedelim. Bir veriye erişmeniz için elinizde bir bağlantı metninizin bulunması gerekmektedir. Bizim projemizdeki bağlantı metninin adı : &lt;font color = "RED"&gt; spider.Properties.Settings.linklerbag &lt;/font&gt; şeklindedir. Config dosyanıza gittiğinizde bu bağlantının yanında Connection String diye bir bölüm olduğunu görürsünüz. Bu bölüm işte bizim bağlantı metni olmaktadır. Proje içinde her seferinde her seferinde kocaman bir bağlantı metni yazmaktansa, config dosyanıza bir kez ekleyip daha sonra verdiğiniz isimle bu metni çağırmanız daha yararlı olacaktır. &lt;br /&gt;&lt;br /&gt;Artık örneklerle konuyu açıklayalım. Diyelim ki programın taramasını istediğimiz bir site var ve biz bu siteyi programa tanıtmak istiyoruz. Aşağıdaki menüden site ekle düğmesine tıkladığımızda :&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_LBrNwSktDyg/SSnk6MpXxkI/AAAAAAAAAEY/0JneXJ4l72A/s1600-h/blog2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 259px;" src="http://3.bp.blogspot.com/_LBrNwSktDyg/SSnk6MpXxkI/AAAAAAAAAEY/0JneXJ4l72A/s320/blog2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271996527292171842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;karşımıza istediğimiz siteyi ekleyebileceğimiz bir yapı gelir:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_LBrNwSktDyg/SSnk9YXNvuI/AAAAAAAAAEg/LKAoeg-DCJU/s1600-h/blog4.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 269px;" src="http://2.bp.blogspot.com/_LBrNwSktDyg/SSnk9YXNvuI/AAAAAAAAAEg/LKAoeg-DCJU/s320/blog4.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5271996581976850146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ürün linklerini arama kriteri kısmında bu bilgiyi elle girmelisiniz şeklinde bir uyarı var. Sebebi yaptığım bir kaç deneme sonucu tırnak (') karakterinin C# için özel bir karakter olmasından dolayı, veritabanına veri atarken sorun yaşamamdı. Çözmek için de çok uğraşmadım. Neyse, gerekli alanları doldurup, site ekle düğmesine bastığımızda arka planda gerçekleşen olaylar daha önemli: &lt;br /&gt;&lt;br /&gt;private static OleDbConnection bag = new OleDbConnection();&lt;br /&gt;bag.ConnectionString = spider.Properties.Settings.Default.linklerbag;&lt;br /&gt;bag.Open();&lt;br /&gt;OleDbCommand ekle = new OleDbCommand();&lt;br /&gt;            ekle.Connection = bag;&lt;br /&gt;            ekle.CommandText = "insert into siteler (anasayfa,regex2,regex3,tara) values ('" + textBox1.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','0')";&lt;br /&gt;            ekle.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;Evet, işte ilk verimizi veritabanımıza attık. Siteler tablomuzun anasayfa alanına, textbox1.text, regex2 alanına textbox3.text, regex3 alanına textbox4.text, tara alanına da 0 değerini atadık. Bunu yaparken yaptığımız işlemlere bakalım: &lt;br /&gt;1) Öncelikle bir bağlantı tanımladık:  OleDBConnection sınıfından türettiğimiz bag nesnesi.&lt;br /&gt;2) Tanımladığımız bağlantının nereye bağlanacağını söyledik. Az önce bahsettiğim config dosyasındaki bağlantı metninin adının burda kullanıldığına dikkatinizi çekerim. Eğer config dosyasında böyle bir tanımlama yapmamış olsaydık, uzun uzun bağlantı metnimizi yazacaktık.&lt;br /&gt;3) Komut sınıfından bir nesne tanımladık ve nereye bağlanacağını söyledik. OleDBCommand sınıfından türettiğimiz ekle nesnesi de bu işi görmektedir. Komuta nereye bağlanacağını belirtmezseniz, çalışma esnasında program hata verecektir. &lt;br /&gt;4) Ekle nesnesinin çalıştıracağı sorguyu yazdık ve son olarak da Ekle.ExecuteNonQuery dedik. Böylece veritabanımıza ilk verimizi atmış olduk. &lt;br /&gt;&lt;br /&gt;Tablomuza veriyi ekledikten sonra veriyi listelemeyi nasıl yaptığımızı da görelim. &lt;br /&gt;&lt;br /&gt;private static OleDbConnection bag = new OleDbConnection();&lt;br /&gt;bag.ConnectionString = spider.Properties.Settings.Default.linklerbag;&lt;br /&gt;bag.Open();&lt;br /&gt;OleDbCommand liste = new OleDbCommand();&lt;br /&gt;liste.Connection = bag;&lt;br /&gt;liste.CommandText = "select anasayfa,tara from siteler";&lt;br /&gt;OleDbDataReader cek = liste.ExecuteReader();&lt;br /&gt;while (cek.Read())&lt;br /&gt;{&lt;br /&gt;   listBox1.Items.Add(cek[0].ToString());&lt;br /&gt;   if (cek[1].ToString().Equals("0"))&lt;br /&gt;   listBox2.Items.Add(cek[0].ToString());&lt;br /&gt;   else listBox3.Items.Add(cek[0].ToString());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Evet, ilk select sorgumuzu yazdık bile. Daha önce söylediğim gibi bir bağlantı tanımladık ve adına bag dedik. bag private static olarak tanımlandı çünkü aslında kendisi bir global değişken. Burda önemli nokta bag.connectionstring ibaresi. Az önce bahsettiğim config dosyasındaki bağlantı metnini burda kullanmış olduk. Liste adında bir tane komut nesnesi tanımladık. komut.connection = bag diyerek de tanımladığımız komutun nereye bağlanacağını, nereyi sorgulayacağını söylemiş olduk. cek adında bir okuyucu nesnesi tanımlayarak liste.executereader() fonksiyonu ile sorgu sonucu oluşan veriyi bu nesneye tanımlamış olduk. &lt;br /&gt;&lt;br /&gt;Burda önemli olan veriyi nereye attığımız değil, veriyi nasıl aldığımız. Yani kilit isim OleDBCommand sınıfından türemiş olan liste nesnesi. "Select anasayfa,tara From Siteler" diyerek siteler tablosundaki tüm sitelerin anasayfa url'lerini ve taranıp taranmadıklarına işaret eden tara alanlarını alıp gelen bir sorgu yazdık ve bunu da liste.commandtext diyerek OLEDBCOMMAND nesnemize atamış olduk. OleDBcommand nesnesinin birden çok kullanışlı fonksiyonu vardır. Örneğin; liste.executeNonQuery diyerek, hiç bir veri dönüşünü beklemeyebilirdik. liste.executeDataset() diyerek sorgu sonucu oluşan veriyi bir datasete aktarabilirdik. keza liste.executeDatatable diyerek bir DataTable nesnesini sorgunun döndürdüğü veriyle doldurabilirdik. &lt;br /&gt;&lt;br /&gt;Programda kullandığımız bir diğer Sql sorgusu da silmedir. Örnek olarak şunu verebiliriz: &lt;br /&gt;&lt;br /&gt;OleDbCommand sil = new OleDbCommand();&lt;br /&gt;                    sil.Connection = bag;&lt;br /&gt;                    sil.CommandText = "delete * from gelen where ID ='" + url + "'";&lt;br /&gt;                    sil.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;Bu sorgunun yaptığı iş de gelen tablosundan, ID'si belirtilen url olan kaydın silinmesidir. Where kısmından sonrasını yazmazsınız Sql size hiç birşey sormadan gelen tablosunu tamamen boşaltacaktır. &lt;br /&gt;&lt;br /&gt;Programda kullandığımız bir komut değil de ama sql sorgusu olarak bir de update komutu var. Kullanımına örnek verecek olursak: &lt;br /&gt;OleDbCommand guncelle = new OleDbCommand();&lt;br /&gt;guncelle.Connection = bag;&lt;br /&gt;guncelle.CommandText = "update gelen set ID = 'zburakguven.blogspot.com' where ID = '"+ url +"'";&lt;br /&gt;guncelle.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;Update komutu da hepinizin bildiği gibi bir ve/veya birden fazla kaydı güncellemek için kullanılır. yukarıdaki sorgu ID'si belirtilen url olan bir kaydın değerini zburakguven.blogspot.com olarak değiştirmektedir. Where kısmından sonrasını yazmazsanız tüm ID alanı zburakguven.blogspot.com olarak değiştirilir.&lt;br /&gt;&lt;br /&gt;Evet, veri işleme kısmını da bu şekilde anlatmaya çalıştıktan sonra geriye artık Thread yapımızı anlatmak kalıyor. Onu da en kısa zamanda yayınlamaya çalışacağım. Programın kodlarını isterseniz, yorum kısmına mail adresinizi bırakmanız yeterli. Son bölümde görüşünceye dek hoşçakalın...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-1801281089528344657?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2008/11/c-ile-spider-crawler-web-rmcek-rnei-blm.html</link><author>noreply@blogger.com (z.burak güven)</author><media:thumbnail url="http://3.bp.blogspot.com/_LBrNwSktDyg/SSnZ_C0PuxI/AAAAAAAAADY/aLsopzIOXyc/s72-c/blog1.jpg" height="72" width="72" /><thr:total>33</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-1316847502278687933</guid><pubDate>Thu, 10 Jul 2008 11:23:00 +0000</pubDate><atom:updated>2008-07-11T18:59:35.123-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>C# ile Spider (Crawler - Web Örümcek) Örneği Bölüm 1</title><description>Uzunca 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 &lt;a href="http://www.hepsiburada.com"&gt;&lt;font color="blue"&gt;hepsiburada.com&lt;/font&gt;&lt;/a&gt;'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  &lt;a href="http://zburakguven.blogspot.com/2008/07/c-ile-spider-crawler-web-rmcek-rnei-blm.html"&gt;burdan devam edebilirsiniz.&lt;/a&gt; &lt;span id="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;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 ?  &lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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&lt;font color=red&gt;ab&lt;/font&gt;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 &lt;br /&gt;ara(ba)+  desenini kullanırsak, araba,arababa,arabababa eşlenir, ancak ara eşlenmez çünkü (ba) en az bir kez tekrar etmemiştir. &lt;br /&gt;&lt;br /&gt;İş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:&lt;font color="red"&gt; [a-zA-Z0-9-_]+&lt;/font&gt;. Evet, şimdiye kadar "@" karakterinden önceki tüm karakterleri eşlemiş olduk." @ " karakterini kontrol etmek için ise desenimize sadece "@" eklemek yeterli olacaktır: &lt;font color="red"&gt; [a-zA-Z0-9-_]+@&lt;/font&gt;. 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:  &lt;font color="red"&gt; [a-zA-Z0-9-_]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}&lt;/font&gt;.  ".(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. &lt;br /&gt;&lt;br /&gt;Ş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: &lt;br /&gt;&lt;a href="http://bp2.blogger.com/_LBrNwSktDyg/SHcRN36ypcI/AAAAAAAAACg/TbqlNO_0TYk/s1600-h/vl2.bmp"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ş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 &lt;strong&gt;ControlToValidate&lt;/strong&gt;'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 &lt;strong&gt;ValidationExpress&lt;/strong&gt; ö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 &lt;font color="red"&gt;\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*&lt;/font&gt; 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. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_LBrNwSktDyg/SHgJRlf2GPI/AAAAAAAAACo/nQ48sip62ss/s1600-h/vl1.bmp"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Örneğimizi çalıştırıp yanlış bir email adresi girdiğimizde aşağıdaki resimdeki gibi bir durumla karşılaşırız: &lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_LBrNwSktDyg/SHgJu3eQdnI/AAAAAAAAACw/X2p8cnQCXD0/s1600-h/vl1.bmp"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ç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 &lt;font color="red"&gt;href="[a-zA-Z0-9=:/.?&amp;-_+;][^"]+&lt;/font&gt; düzenli ifadesiyle veya daha kolay olarak &lt;font color="red"&gt; href=.[^"]+&lt;/font&gt; ş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 &lt;font color="blue"&gt;&lt;a href="abc.aspx"&gt;&lt;/a&gt;&lt;/font&gt; 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. &lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.regular-expressions.info/"&gt;regularexpression.info&lt;/a&gt; sitesine sık sık başvurdum. Çeşitli online desen test eden yerler var, bunlardan biri de &lt;a href="http://regexlib.com/RETester.aspx"&gt; ReTester&lt;/a&gt;  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...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-1316847502278687933?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2008/07/c-ile-spider-crawler-web-rmcek-rnei-blm.html</link><author>noreply@blogger.com (z.burak güven)</author><media:thumbnail url="http://bp2.blogger.com/_LBrNwSktDyg/SHcRN36ypcI/AAAAAAAAACg/TbqlNO_0TYk/s72-c/vl2.bmp" height="72" width="72" /><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-8280236873831550694</guid><pubDate>Sun, 06 Jan 2008 03:33:00 +0000</pubDate><atom:updated>2008-01-05T19:38:52.231-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Kafamıza Göre</category><title>AŞKA VE TERKE DAİR</title><description>&lt;a href="http://zburakguven.blogspot.com/2008/01/aska-ve-terke-dair.html"&gt;Aska Ve Terke Dair... -CAN DÜNDAR- &lt;br /&gt;&lt;/a&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Bazen öyle bir iliskiye tutulursunuz ki, ne sevebilir,ne&lt;br /&gt;terkedebilirsiniz. Kör kütük baglanmissinizdir aslinda... En güzel&lt;br /&gt;yillarinizin, aci tatli hatiralarinizin ortagidir; iç çekismelerinizin&lt;br /&gt;müsebbibi, yazilarinizin ilhami, sohbetlerinizin konusudur. Gözyaslarinizda,&lt;br /&gt;bilinçaltinizda, kahkahanizdadir. Korkunca saklandiginiz bir siginak,cosunca&lt;br /&gt;öptügünüz bir bayrak...Sevdaniz riyasiz, çikarsiz, karsiliksizdir.Sinirsiz&lt;br /&gt;ve nihayetsiz;&lt;br /&gt;"Ölmek var, dönmek yok"tur.&lt;br /&gt;                                    * * *&lt;br /&gt;Lakin gün gelir anlarsiniz; içten içe bir seylerin kanadigini...&lt;br /&gt;Tutkulu sevdalarin gizli hançerleri baslar parildamaya...Surasindan,&lt;br /&gt;burasindan elestirmeye koyulursunuz:&lt;br /&gt;"Söyle görünse, öyle demese, degisse biraz ya da eskisi gibi olsa..."&lt;br /&gt;Baskalarini örnek göstermeye, "Bak onlar nasil yasiyor" demeye&lt;br /&gt;baslarsiniz. Hem birlikte yasayip, hem özgür olmanin yollarini ararsiniz.&lt;br /&gt;Askinizin gözü kör degildir artik, yanlisini görür düzeltmek istersiniz.&lt;br /&gt;"Eskiden böyle miydi ya.." diye baslayan sohbetlerde&lt;br /&gt;açilir elestirinin kapisi; açildikça, bastirilmis itirazlar yükselir&lt;br /&gt;bilinçaltindan... Böyle süremeyecegini bilirsiniz. Degissin istersiniz.&lt;br /&gt;O, sevgisizliginize yorar bunu... Ihanete sayar. Tutkulu iliskilerde&lt;br /&gt;ihanetin bedeli ölümdür. "Ya sev böyle ya da terket" diye gürler...&lt;br /&gt;                                * * *&lt;br /&gt;Bir zamanlar bir gülücügüyle alacakaranligi isitan o rüya, bir kabusa&lt;br /&gt;dönüsür birden... Kapatir gönlünün kapilarini, yasaklar kendini size...&lt;br /&gt;Hoyrattir, bakmaz yüzünüze... Zehir akar dilinden, konusturmaz,&lt;br /&gt;suçlar,yargilar mahkum eder. Mühürler dudaklarinizi, yirtar atar&lt;br /&gt;yazdiklarinizi, siler sizi defterden... "Iyiligin içindi hepsi, seni&lt;br /&gt;sevdigim için..." dersiniz,dinletemezsiniz. Ayrilirsaniz asamayacaginizi&lt;br /&gt;bilirsiniz, lakin böyle de sevemezsiniz. Ihanetten kirilmistir kaleminiz;&lt;br /&gt;severek, terk edersiniz...&lt;br /&gt;&lt;br /&gt;* * *&lt;br /&gt;"Madem öyle..."nin çagi baslar ondan sonra...Madem ki siz böylesine&lt;br /&gt;tutkunken, o hep baskalarini seçmistir, madem ki kiymetinizi bilmemistir, o&lt;br /&gt;halde "günah sizden gitmistir". Lanet ederek bu karsiliksiz aska, çekip&lt;br /&gt;gitmeleri denersiniz. Askin göçmenlik çagi baslar böylece... Daha özgür&lt;br /&gt;olacaginiz limanlara demirlerseniz bir süre... Ne var ki unutamaz, uzaktan&lt;br /&gt;uzaga izlersiniz olup biteni... Etrafi bir sürü ugursuzla dolmus, kurda kusa&lt;br /&gt;yem olmustur. Deli kanlilar, eli kanlilar, ugruna ölenler, sirtina binenler&lt;br /&gt;sarmistir&lt;br /&gt;çevresini... Gurur duyar onlarla, koynunda besler, gözünü oysunlar&lt;br /&gt;diye... Ugruna kan dökenleri sever, yoluna gül dökenlerden fazla... "Bana&lt;br /&gt;ne... kendi seçimi" diye omuz silkmeye çabalarsiniz bir süre... Ama sonra...&lt;br /&gt;ansizin kulagimiza çalinan bir sarki ya da kapi araligindan süzülüp gelen&lt;br /&gt;bir koku, hatirlatir onu yeniden... Yaban ellerde,&lt;br /&gt;baska kollarda ondan bahseder aglarsiniz. Kokusunu özlersiniz; türküsünü&lt;br /&gt;söylemeyi, sarkisini dinlemeyi, yemegini yemeyi, elinden bir kadeh&lt;br /&gt;raki içmeyi... Karsi nehrin kenarindan hasret siirleri haykirirsiniz, sular&lt;br /&gt;kulagina fisildasin diye...&lt;br /&gt;Dönüp "Seni hala seviyorum" diye bagirmak geçer içinizden...Dönemezsiniz.&lt;br /&gt;Göremedikçe baglanir, uzaklastikça yakinlasirsiniz.&lt;br /&gt;&lt;br /&gt;                                * * *&lt;br /&gt;Anlarsiniz ki bir çaresiz asktir bu, ne onunla olur, ne onsuz... Hem&lt;br /&gt;kollarinda ölmek, kucagina gömülmek arzusu, hem "Ne olacak&lt;br /&gt;sonunda"kuskusu... Böyle sevemezsiniz, terk de edemezsiniz. Sürünür&lt;br /&gt;gidersiniz...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-8280236873831550694?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2008/01/aska-ve-terke-dair.html</link><author>noreply@blogger.com (z.burak güven)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-3326194809104985745</guid><pubDate>Thu, 18 Oct 2007 13:23:00 +0000</pubDate><atom:updated>2008-01-05T19:39:00.958-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows</category><title>explorer ana sayfa değişmiyor...</title><description>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 &lt;a href="http://zburakguven.blogspot.com/2007/10/explorer-ana-sayfa-deimiyor.html"&gt;  çözüme ulaşmış olurduk... &lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;font color="red"&gt; başlat-&gt; çalıştır-&gt; regedit &lt;/font&gt; diyip kayıt defterimize girdikten sonra &lt;font color="red"&gt;HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main &lt;/font&gt; kısmındaki &lt;font color="red"&gt; start page &lt;/font&gt; 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 &lt;font color="blue"&gt;www.google.com&lt;/font&gt; sitesindeki en aşağıda bulunan &lt;font color="blue"&gt;Google'ı Başlangıç Sayfanız Yapın!&lt;/font&gt; linkine tıklayarak gelebiliyorduk. artık bu da işe yaramıyor ama demokraside çareler tükenmez... &lt;font color="red"&gt; HKEY_CURRENT_USER \ SOFTWARE \ Policies \ Microsoft \ Internet Explorer \ Control Panel&lt;/font&gt; kısmındaki &lt;font color="red"&gt;Home Page&lt;/font&gt; değişkenini &lt;font color="red"&gt;0&lt;/font&gt; olarak değiştirirsek sorunumuz çözülmüş olacaktır. Herkese mutlu günler...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-3326194809104985745?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2007/10/explorer-ana-sayfa-deimiyor.html</link><author>noreply@blogger.com (z.burak güven)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-5636786350869805965</guid><pubDate>Wed, 17 Oct 2007 21:21:00 +0000</pubDate><atom:updated>2007-10-18T06:22:46.774-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">windows</category><title>windows başlarken numlock çalışmıyorsa</title><description>arkadaşlar saçma sapan bir bilgi gibi gelebilir ama eminim aranızda windows başlarken numlock ışığının yanmamasına sinir olanlar olmuştur. &lt;a href="http://zburakguven.blogspot.com/2007/10/windows-balarken-numlock-almyorsa.html"&gt; buyrun burdan devam edelim...&lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;ş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... &lt;font color="red"&gt; başlat -&gt; çalıştır -&gt; regedit &lt;/font&gt; yazıyoruz ve kayıt defterimize giriyoruz. buradan sonra &lt;font color="red"&gt; HKEY_CURRENT_USER\Control Panel\Keyboard kısmındaki InitialKeyboardIndicators &lt;/font&gt; değişkenimizin değerini 0 veya 1 'se 2 olarak değiştiriyoruz. hala sorun giderilmediyse bu sefer &lt;font color="red"&gt; HKEY_USERS\.DEFAULT\Control Panel\Keyboard kısmındaki InitialKeyboardIndicators &lt;/font&gt; 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.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-5636786350869805965?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2007/10/windows-balarken-numlock-almyorsa.html</link><author>noreply@blogger.com (z.burak güven)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-2999327626830846872</guid><pubDate>Mon, 24 Sep 2007 08:20:00 +0000</pubDate><atom:updated>2008-01-05T19:39:13.243-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>kullanıcı mesajları için küçük enstanteneler..</title><description>.net 2005 te asp.net ile uğraşıyorsunuz ve kullanıcı mesajları başınıza dert mi oluyor ? o zaman birlikte &lt;a href="http://zburakguven.blogspot.com/2007/09/kullanc-mesajlar-iin-kk-enstanteneler.html"&gt;&lt;span style="color:blue;"&gt;devam edelim :)&lt;/span&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;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...&lt;br /&gt;&lt;br /&gt;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..&lt;br /&gt;&lt;br /&gt;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..&lt;br /&gt;&lt;br /&gt;Ö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;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Response.Write("&lt;&gt; alert('Proje ismini boş bırakmayınız..') &lt; / script&gt;");&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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..&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;protected void DataGrid1_ItemDataBound(object sender, DataGridItemEventArgs e)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;if (e.Item.ItemType == ListItemType.Item e.Item.ItemType == ListItemType.AlternatingItem)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;{e.Item.Cells[1].Attributes.Add("onclick", " return confirm ('Silmek Istediginizden Emin misiniz? ')");&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;burada e.Item.Cells[1].Attributes satırındaki [1] delete pushbutton'un bulunduğu kolon sırasına işaret etmektedir.&lt;br /&gt;&lt;br /&gt;Esenkalın...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-2999327626830846872?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2007/09/kullanc-mesajlar-iin-kk-enstanteneler.html</link><author>noreply@blogger.com (sevdalinka)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-5549049441763119120</guid><pubDate>Wed, 19 Sep 2007 00:28:00 +0000</pubDate><atom:updated>2007-09-23T18:10:19.029-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>c# ile Mail Atma Programı</title><description>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 &lt;a href="http://zburakguven.blogspot.com/2007/09/mail-atma-program.html"&gt;&lt;font color ="blue"&gt;tıklayın&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;ö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. &lt;br /&gt;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ı-&gt;program ekle/kaldır-&gt; 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.&lt;br /&gt;&lt;br /&gt;gelelim programımıza... öncelikle tasarladığım arayüzü göstereyim:&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_LBrNwSktDyg/RvBy2RN27WI/AAAAAAAAAAs/98rnwedCO6o/s1600-h/mail.bmp"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;br /&gt;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: &lt;br /&gt;&lt;font color="red"&gt; protected void Button1_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        MailMessage posta = new MailMessage();&lt;br /&gt;        posta.To.Add(TextBox1.Text);&lt;br /&gt;        posta.From = new MailAddress("mail adresiniz", "herhangi bir isim", System.Text.Encoding.UTF8);&lt;br /&gt;        posta.Body = TextBox2.Text;&lt;br /&gt;        posta.BodyEncoding = System.Text.Encoding.UTF8;&lt;br /&gt;        posta.Subject = "mail gönderme programı";&lt;br /&gt;        posta.IsBodyHtml = false;&lt;br /&gt;        posta.Priority = MailPriority.High;&lt;br /&gt;        SmtpClient smtp = new SmtpClient();&lt;br /&gt;        smtp.Credentials = new System.Net.NetworkCredential("kendi mail adresiniz", "şifreniz");&lt;br /&gt;        smtp.Port = 587;&lt;br /&gt;        smtp.EnableSsl = true;&lt;br /&gt;        smtp.Send(posta);&lt;br /&gt;    }&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;system.net.mail kütüphanesindeki mailmessage sınıfından &lt;font color="red"&gt;posta&lt;/font&gt; isminde bir nesne türetiyoruz. öncelikle postayı kime göndereceğimizi belirtiyoruz. &lt;font color="red"&gt;posta.to &lt;/font&gt; ö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 &lt;font color="red"&gt;posta.to.add(mail adresi)&lt;/font&gt; metoduyla gönderilecekler listesine eklemeniz mümkün. sıra geldiği postanın kimden gittiğine. bu kişi siz oluyorsunuz. &lt;font color="red"&gt; posta.from &lt;/font&gt; özelliğine mailaddress nesnesi atayarak bu sorunu da çözüyoruz. &lt;font color="red"&gt;posta.body &lt;/font&gt;ö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 &lt;font color="red"&gt;posta.isbodyhtml &lt;/font&gt; özelliğini &lt;font color="red"&gt;true &lt;/font&gt; ş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 (&lt;font color="red"&gt;smtp &lt;/font&gt;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 &lt;font color="red"&gt;enableSsl&lt;/font&gt; özelliğini &lt;font color="red"&gt;true&lt;/font&gt; 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 &lt;font color="red"&gt;smtp.send(posta)&lt;/font&gt; ş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...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-5549049441763119120?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2007/09/mail-atma-program.html</link><author>noreply@blogger.com (z.burak güven)</author><media:thumbnail url="http://bp1.blogger.com/_LBrNwSktDyg/RvBy2RN27WI/AAAAAAAAAAs/98rnwedCO6o/s72-c/mail.bmp" height="72" width="72" /><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7768838126539432016.post-1838571316167470568</guid><pubDate>Mon, 17 Sep 2007 21:40:00 +0000</pubDate><atom:updated>2007-09-19T05:25:25.149-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programlama</category><title>c# 2005 ile basit bir chat programı</title><description>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 &lt;a href="http://zburakguven.blogspot.com/2007/09/c-2005-ile-basit-bir-chat-program_17.html"&gt;tıklayın...&lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;   &lt;br /&gt;   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. &lt;br /&gt;   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. &lt;br /&gt;   &lt;br /&gt;   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: &lt;br /&gt;&lt;a href="http://bp0.blogger.com/_LBrNwSktDyg/Ru6ZgwkBu9I/AAAAAAAAAAc/DTJHaTAFGOg/s1600-h/serv.bmp"&gt;&lt;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" /&gt;&lt;/a&gt; &lt;br /&gt;    sunucu tarafında aşağıdaki bileşenlerden türettiğim bazı global değişkenler var: &lt;br /&gt;    tcplistener: tcp'ye uygun bir port dinleme bileşenidir. &lt;br /&gt;    networkstream: iki program arasında bağlantıyı kuran yapıdır.  &lt;br /&gt;    streamwriter: networkstream'e veri yazmak için kullandığımız bileşendir. &lt;br /&gt;    streamreader: networkstream'den veri okumak için kullandığımız bileşendir. &lt;br /&gt;ç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. &lt;br /&gt;    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. &lt;br /&gt;    &lt;font color="red"&gt;Thread t;&lt;br /&gt;    TcpListener dinle;&lt;br /&gt;    private void button1_Click(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;       dinle= new TcpListener(System.Net.IPAddress.Any,Convert.ToInt16(textBox1.Text));&lt;br /&gt;       dinle.Start();&lt;br /&gt;       t = new Thread(new ThreadStart(okumayabasla));&lt;br /&gt;       t.Start();&lt;br /&gt;    }&lt;/font&gt;&lt;br /&gt;    bu aşamadan sonra okumak için kullandığım fonksiyonu göstereyim: &lt;br /&gt;    &lt;font color="red"&gt;&lt;br /&gt;        Socket soket;&lt;br /&gt;        NetworkStream ag;&lt;br /&gt;        StreamReader oku;&lt;br /&gt;        public void okumayabasla()&lt;br /&gt;        {&lt;br /&gt;            soket = dinle.AcceptSocket();&lt;br /&gt;            ag = new NetworkStream(soket);&lt;br /&gt;            oku = new StreamReader(ag);&lt;br /&gt;            while (true)&lt;br /&gt;            {   try&lt;br /&gt;                {   string  yazi= oku.ReadLine();&lt;br /&gt;                    ekranabas(yazi);&lt;br /&gt;                }&lt;br /&gt;                catch&lt;br /&gt;                {return;}&lt;br /&gt;            }}&lt;/font&gt;&lt;br /&gt;    sanırım networkstream ile streamreader ikilisinin kullanımı anlaşılmıştır.&lt;font color="red"&gt;acceptsocket&lt;/font&gt; isimli metot,tcp bir ağda herhangi bir veri talebinin kabul edilmesi için kullanılır.&lt;font color="red"&gt;ekranabas&lt;/font&gt; 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:&lt;br /&gt;     &lt;font color="red"&gt;public delegate void ricdegis(string text);&lt;br /&gt;public void ekranabas(string s)&lt;br /&gt;        {if (this.InvokeRequired)&lt;br /&gt;            {ricdegis degis = new ricdegis(ekranabas);&lt;br /&gt;             this.Invoke(degis, s);&lt;br /&gt;            }&lt;br /&gt;            else&lt;br /&gt;            {s = "istemci: " + s;&lt;br /&gt;             richTextBox1.AppendText(s+"\n");&lt;br /&gt;        }   }&lt;/font&gt;&lt;br /&gt;gelen yazıları okumak bu kadar uzun sürüyor ancak yazmak o kadar da zor değil: &lt;br /&gt;&lt;font color ="red"&gt;StreamWriter yaz;&lt;br /&gt; private void button2_Click(object sender, EventArgs e)&lt;br /&gt;        {yaz = new StreamWriter(ag);&lt;br /&gt;         yaz.WriteLine(textBox2.Text);&lt;br /&gt;         yaz.Flush();&lt;br /&gt;         textBox2.Text = "";&lt;br /&gt;        }&lt;/font&gt;&lt;br /&gt;   evet programımızın &lt;font color="red"&gt; server kısmı&lt;/font&gt; 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: &lt;br /&gt;&lt;a href="http://bp1.blogger.com/_LBrNwSktDyg/Ru8VrwkBu-I/AAAAAAAAAAk/xqLOMyvZua0/s1600-h/iste.bmp"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;br /&gt;   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: &lt;br /&gt;&lt;font color ="red"&gt;TcpClient iste;&lt;br /&gt;private void button1_Click(object sender, EventArgs e)&lt;br /&gt;        {   iste = new TcpClient(textBox1.Text, Convert.ToInt16(textBox2.Text));&lt;br /&gt;            ag = iste.GetStream();&lt;br /&gt;            yaz = new StreamWriter(ag);&lt;br /&gt;            t = new Thread(new ThreadStart(okumayabasla));&lt;br /&gt;            t.Start();&lt;br /&gt;        }&lt;br /&gt;        public void okumayabasla()&lt;br /&gt;        {   oku = new StreamReader(ag);&lt;br /&gt;            while (true)&lt;br /&gt;            {   try&lt;br /&gt;                {   string yazi = oku.ReadLine();&lt;br /&gt;                    ekranabas(yazi);&lt;br /&gt;                }&lt;br /&gt;                catch{return;}&lt;br /&gt;            }}&lt;/font&gt;&lt;br /&gt;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...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7768838126539432016-1838571316167470568?l=zburakguven.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://zburakguven.blogspot.com/2007/09/c-2005-ile-basit-bir-chat-program_17.html</link><author>noreply@blogger.com (z.burak güven)</author><media:thumbnail url="http://bp0.blogger.com/_LBrNwSktDyg/Ru6ZgwkBu9I/AAAAAAAAAAc/DTJHaTAFGOg/s72-c/serv.bmp" height="72" width="72" /><thr:total>77</thr:total></item><language>en-us</language><media:rating>nonadult</media:rating></channel></rss>

